Promise 对象用于延迟(deferred) 计算和异步(asynchronous ) 计算。 一个 Promise 对象代表着一个还未完成,但预期将来会完成的操作。
API
- Promise.all(iterable)
- 返回一个promise对象,当iterable参数里所有的promise都被解决后,该promise也会被解决。
- Promise.race(iterable)
- 当iterable参数里的任意一个子promise被成功或失败后,父promise马上也会用子promise的成功返回值或失败详情作为参数调用父promise绑定的相应句柄,并返回该promise对象。
- Promise.reject(reason)
- 调用Promise的rejected句柄,并返回这个Promise对象。
- Promise.resolve(value)
- 将现有对象转为Promise对象。
- Promise.prototype.then(onFulfilled, onRejected)
- 添加正常和异常的回调到当前 promise 对象的函数.
- Promise.prototype.catch(onRejected)
- 添加一个否定(rejection) 回调到当前 promise, 返回一个新的promise。如果这个回调被调用,新 promise 将以它的返回值来resolve,否则如果当前promise 进入fulfilled状态,则以当前promise的肯定结果作为新promise的肯定结果.
Examples
下面代码执行后打印结果的先后顺序 会因为 Math.random 产生的随机数而受影响
'use strict';
var testPromise = (function(){
var count = 1;
return function(order){
//定义一个 Promise 对象
var pi = new Promise(function (resolve, reject) {
setTimeout(function () {
resolve(count++);
}, Math.round(Math.random() * 100) + 1000);
});
//添加一个 Resolved 函数
pi.then(function (reslut) {
console.log(order ," -- " ,reslut);
});
};
})();
testPromise("A");
testPromise("B");
testPromise("C");
Promise.all
处理一个或多个 promise 集合
'use strict';
var testPromise = (function(){
var count = 1;
return function(){
var promises = [1,2,3,4,5].map(function (id) {
return new Promise(function (resolve,reject) {
setTimeout(function () {
resolve(count++);
}, Math.round(Math.random() * 100) + 1000);
});
});
Promise.all(promises).then(function (reslut) {
console.log("success : ",reslut);
}).catch(function(reslut){
console.log("error : ",reslut);
});
};
})();
testPromise();
需要注意事先好的 5 个 Promise 不能出现异常, 其中任意一个出现异常,
Promise 的状态都将为 catch 需要处理 error
Promise.resolve
将现有对象转为 Promise 对象
'use strict';
test.json : {
"test" : "test"
}
var pi = Promise.resolve($.get('test.json'));
pi.then(function (reslut) {
console.log("success : ",reslut);
},function(error){
console.log("error : ",error);
});
Promise.reject
将现有对象转为 Promise 对象, 与 Promise.resolve 差不多, 只监听异常 个人觉得这个功能能用上的场景很少
'use strict';
var pi = Promise.reject($.get('test.json'));
// 第一个 Resolved 不用写, 不会执行
pi.then(null,function(error){
console.log("error : ",error);
});
Promise.race
同 Promise.all 一样接收一个数组,不同的是只要该数组中的任意一个 Promise 对象的状态发生变化 ( 无论是 resolve 还是 reject ) 该方法都会返回。
'use strict';
var testPromise = (function(){
var count = 1;
return function(){
var promises = [1,2,3,4,5].map(function (id) {
return new Promise(function (resolve,reject) {
setTimeout(function () {
resolve(count++);
}, Math.round(Math.random() * 100) + 1000);
});
});
Promise.race(promises).then(function (reslut) {
console.log("success : ",reslut);
}).catch(function(reslut){
console.log("error : ",reslut);
});
};
})();
testPromise();