Promise

Promise 对象用于延迟(deferred) 计算和异步(asynchronous ) 计算。 一个 Promise 对象代表着一个还未完成,但预期将来会完成的操作。

API


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();