Promise 对象是一个代理对象(代理一个值),被代理的值在Promise对象创建时可能是未知的。它允许你为异步操作的成功和失败分别绑定相应的处理方法(handlers )。 这让异步方法可以像同步方法那样返回值,但并不是立即返回最终执行结果,而是一个能代表未来出现的结果的promise对象
一个 Promise有以下几种状态:
- pending: 初始状态,不是成功或失败状态。
- resolved: 已经有结果的状态,包括:fulfilled操作成功完成, rejected: 意味着操作失败。
构造函数:
new Promise(
function(resolve, reject) {
if(true){
resolve(1);
}else{
reject(2);
}
}
);
属性:
Promise.length:长度属性,其值总是为 1 (构造器参数的数目).
Promise.prototype:表示 Promise 构造器的原型.
方法:
Promise.prototype.then(onFulfilled, onRejected)
var p1 = new Promise(
function(resolve, reject) {
if(true){
resolve(1);
}else if(true){
reject(2);
}else{
throw new Error('错了');
}
}
);
p1.then(function(value) {
alert(value);//alert(1)
}, function(reason) {
alert(reason);//alert(2)或者alert(错了)
});
Promise.resolve(value)回一个promise对象,这个promise对象是被解析后(resolved)的。
var p = Promise.resolve([1,2,3]);
p.then(function(v) {
console.log(v[0]); // 1
});
Promise.all 等待所有代码的完成(或第一个代码的失败)。
var p1 = Promise.resolve(3);
var p2 = 1337;
var p3 = new Promise(function(resolve, reject){
setTimeout(resolve, 100, "foo");
});
Promise.all([p1, p2, p3]).then(function(values){
console.log(values); // [3, 1337, "foo"]
});
Promise.prototype.catch(onRejected)
var p1 = new Promise(
function(resolve, reject) {
if(true){
resolve(1);
}else if(true){
reject(2);
}else{
throw new Error('错了');
}
}
);
p1.then(function(value) {
alert(value);//alert(1)
})
.catch(function(reason) {
alert(reason);//alert(2)或者alert(错了)
});
备注:Uncaught的意思是代表有reject状态没有被catch。
详情请参考:
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise/all
详情请参考:http://blog.csdn.net/u013628992/article/details/50683255
$.Deferred:构造函数创建一个新的Deferred(延迟)对象。new 运算是可选的。
var dtd = $.Deferred(); // 新建一个deferred对象
var wait = function(dtd){
var tasks = function(){
alert("执行完毕!");
dtd.resolve(); // 改变deferred对象的执行状态
};
setTimeout(tasks,5000);
return dtd;
};
deferred.notify(args) = > deferred.progress( progressCallbacks )
(deferred.resolve(args)或 deferred.resolveWith(context,args))= > deferred.done( doneCallbacks [, doneCallbacks ] ) = > deferred.isResolved()
(deferred.reject(args) 或deferred.rejectWith(context,args))= > deferred.fail( doneCallbacks [, doneCallbacks ] ) = > deferred.isRejected()
deferred.then( doneCallbacks, failCallbacks [, progressCallbacks ] ) 与 deferred.always( alwaysCallbacks [, alwaysCallbacks ] ):后者是Deferred(延迟)得到解决或者拒绝时, alwaysCallbacks 始终都会被执行。前者是当Deferred(延迟)对象解决,拒绝或仍在进行中时,调用添加处理程序。
$.when(deferreds):提供一种方法来执行一个或多个对象的回调函数, Deferred(延迟)对象通常表示异步事件。
deferred.promise():回Deferred(延迟)的Promise(承诺)对象。Promise (承诺)对象仅会暴露那些需要绑定额外的处理或判断状态的延迟方法(then, done, fail, always, pipe, progress, 和 state)时,并不会暴露任何用于改变状态的延迟方法(resolve, reject, notify, resolveWith, rejectWith, 和 notifyWith).
eferred.state(): 方法返回一个字符串,代表Deferred(延迟)对象的当前状态。
-“pending”: Deferred对象是尚未完成状态 (不是 “rejected” 或 “resolved”).
-“resolved”: Deferred对象是在解决状态,这意味着,deferred.resolve() 或者 deferred.resolveWith()被对象访问和doneCallbacks被访问(或在被调用的过程中) 。
-“rejected”: Deferred对象是在被拒绝的状态,这意味着,deferred.reject() 或者 deferred.rejectWith() 被对象访问和failCallbacks被访问(或在被调用的过程中) 。
注意:返回的 Promise 被链接到延迟对象上,保存在元素的 .data() 中。由于 .remove() 方法会移除元素上的 data,同时也会移除元素本身。所以,使用它会防止任何元素上未被受理的(unresolved) Promise 被受理(resolving)。如果有必要在元素的 Promise 被受理(resolved)之前,从 DOM 中移除该元素的话,请使用 .detach() 来代替。之后再调用 .removeData()
var wait = function(ms) {
var dtd = $.Deferred();
setTimeout(dtd.resolve, ms);
return dtd; //此处也可以直接返回dtd
};
var now = wait(2500);
now.reject();
now.done(function() {
console.log('haha,师太,你可让老衲久等了');
}).fail(function() {
console.log('失败了');
}).progress(function(res) {
console.log('等待中...');
});
//console.log('失败了');
var wait = function(ms) {
var dtd = $.Deferred();
setTimeout(dtd.resolve, ms);
return dtd.promise(); //此处也可以直接返回dtd
};
var now =wait(2500);
now.reject();
now.done(function() {
console.log('haha,师太,你可让老衲久等了');
}).fail(function() {
console.log('失败了');
}).progress(function(res) {
console.log('等待中...');
});
//Uncaught TypeError: now.reject is not a function
具体请参考:https://segmentfault.com/a/1190000000523676
具体请参考:http://www.jquery123.com/category/deferred-object/