Javascript Promise 学习笔记

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise

使用方法

一般来说是这样使用的:

首先将某个传统的回调型异步函数转换为 Promise 型。

let fun = function(arg, callback) {};

let funPromise = arg=>{
    return new Promise((ok, ko)=>{
        fun(arg, (err, data)=>{
            if(err) ko(err);
            else    ok(data);
        });
    });
};

funPromise('arg')
.then(data=>{})
.then(()=>{})
.catch(err=>{});

每一个 then() 里面至多一个异步函数。(不允许嵌套)

这时将这个异步函数也改写成 Promise 对象,并且将其 return 即可。

某个 then() 里面也有可能没有异步函数,仅仅是同步代码。

这时将要传输的内容直接 return,即可传递给下一个 then()

错误处理

在 then() 中直接使用 throw new Error(),在 new Promise() 中不能这么做。

四个静态方法

Promise.all()

接受 Promises 组成的数组或 Object,返回一个 Promise。

并发执行,当那些 Promises 均成功执行才会成功,否则失败。

Promise.race()

和上面类似,不过是看哪个 Promise 最先执行完,它成功自己就成功,它失败就失败。

Promise.resolve(arg)

返回一个已经成功执行一个步骤,并 return arg 的 Promise 对象。可以直接接在后面写 .then(arg=>{})

不过如果通过此方法而不是 new Promise() 来作为任务链的开始,通常是不必要的,因为 Promise 任务链的开始往往是一个异步函数,而不应该是一些同步的语句。

Promise.reject(arg)

和上面类似,返回失败的一个 Promise 对象。

需要注意的

  1. Promise.prototype.then() 其实接受了 2 个函数作为参数,其中第二个参数会在上一个步骤失败的时候被调用。

  2. .catch() 后面再加个 .then() 可以实现 try-catch-final 的结构。

发布者

胡中元

《中原驿站》站长

《Javascript Promise 学习笔记》上有2条评论

  1. 目前js有很多框架要致力解决js金字塔回调,让异步代码书写的逻辑更为清晰,如async, wind.js, promise, deffer。

    async 代码:

    async.waterfall([  
        function Task1(callback) {
            callback(null, 'a');
        },
        function Task2(last, callback) {
            // last now equals 'a'
            callback(null, 'b');
        },
        function Task3(last, callback) {
            // last now equals 'b'
            callback(null, 'done');
        }
    ], function (err, result) {
        // result now equals 'done'
    });
    

    可读性不比 Promise 差,缺点也和 Promise 一样:

    需要额外的代码来维护这一系列异步代码,而 await 就不需要。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注