Promise

Posted Cmyoung

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Promise相关的知识,希望对你有一定的参考价值。

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

以上是关于Promise的主要内容,如果未能解决你的问题,请参考以下文章

前端面试题之手写promise

什么时候然后从Promise.all()的子句运行?

Typescript编译器无法从Promise resolve调用中推断类型

前端片段整理

在 Promise 中包装 Auth0 的 parseHash 函数

在javascript承诺中执行的顺序是什么