博客
关于我
图解 Promise 实现原理(二)—— Promise 链式调用
阅读量:794 次
发布时间:2019-03-24

本文共 2436 字,大约阅读时间需要 8 分钟。

Promise 链式调用的实现与意义

引言

在学习 Promise 的过程中,许多开发者能够理解其基本用法,却难以触及其内部的工作原理。通过揭开 Promise 链式调用的神秘面纱,可以更好地掌握这一强大的异步处理工具。

前言

上一节中,我们实现了 Promise 的基础版本,并探讨了其基本的链式调用的概念。但链式调用并不仅仅是简单的 return this,而是涉及到创建新 Promise 实例的逻辑。

链式调用的实现

从代码上看,我们可以看到 then 方法返回了一个新的 Promise 实例,这标志着链式调用的开始。这个新实例的 resolve 和 reject 方法会被注册到当前 Promise 的 callbacks 队列中。

```javascript    then(onFulfilled) {        return new Promise(resolve => {            this._handle({                onFulfilled: onFulfilled || null,                resolve: resolve            });        });    }    

通过上述实现,可以看出每个 then 方法都在返回一个新的 Promise 实例。而这个过程其实非常关键,它决定了当前 Promise 和后续 Promise 的关系。每当当前 Promise 完成,它会传递结果给下一个 Promise 的 resolve 方法,从而实现了链式调用的效果。

链式调用的流程图

链式调用的真正意义

链式调用的真正意义在于它允许我们通过一个 Promise 调用多个后续的 Promise,而每个 Promise 的结果会被传递给下一个。这听起来很抽象,但如果看一下下面的示例:

```javascript    new Promise(resolve => {        mockAjax('getUserId', 1, function (result) {            resolve(result);        });    }).then(result => {        console.log(result);        return '加工后的结果';    }).then(exResult => {        console.log(exResult);    });    

在这个例子中,第一个 Promise 调用 mockAjax 做一个异步请求。当这个请求完成时,第一个 Promise 的 resolve 方法被调用,传递结果给第二个 Promise。第二个 Promise 执行 then 方法的回调,进一步加工结果,并传递给第三个 Promise。最终所有的结果都会被处理并输出。

这种特性使得 Promise 成为了处理异步任务的标准工具,特别是在需要多个依赖的条件下。每个 then 方法不仅仅是注册一个回调,更是创建了一个新的 Promise 实例,以便将当前的状态传递给它。

```javascript        const pUserId = new Promise(resolve => {            mockAjax('getUserId', 1, function (result) {                resolve(result);            });        });                pUserId.then(id => {            console.log(id);            return new Promise(resolve => {                mockAjax('getUserName', 2, function (name) {                    resolve(name);                });            });        }).then(name => {            console.log(name);        });        

在这个例子中,我们创建了两个 Promise:pUserId 和 pUserName。pUserId完成后,它的 then 方法返回一个新的 Promise实例,该实例去执行获取用户姓名的操作。当所有操作完成后,最后一个 then 方法的回调会输出最终的结果。这展示了链式调用的强大之处,它允许我们将多个异步操作串行执行,并在每一步都处理结果。

总结

通过对 Promise 链式调用的深入分析,我们可以看出它的核心在于 then 方法返回一个新的 Promise 实例。这意味着每个 then 都相当于为当前 Promise 注册了一个回调,并自动创建了一个与其相关联的新 Promise。这种机制使得链式调用的实现变得更加高效和自动化。而在实际开发中,我们可以灵活地根据需要编写 Promise链式调用的逻辑,无论是单一的还是多级的。

转载地址:http://xllkk.baihongyu.com/

你可能感兴趣的文章
multipart/form-data与application/octet-stream的区别、application/x-www-form-urlencoded
查看>>
mysql cmake 报错,MySQL云服务器应用及cmake报错解决办法
查看>>
Multiple websites on single instance of IIS
查看>>
mysql CONCAT()函数拼接有NULL
查看>>
multiprocessing.Manager 嵌套共享对象不适用于队列
查看>>
multiprocessing.pool.map 和带有两个参数的函数
查看>>
MYSQL CONCAT函数
查看>>
multiprocessing.Pool:map_async 和 imap 有什么区别?
查看>>
MySQL Connector/Net 句柄泄露
查看>>
multiprocessor(中)
查看>>
mysql CPU使用率过高的一次处理经历
查看>>
Multisim中555定时器使用技巧
查看>>
MySQL CRUD 数据表基础操作实战
查看>>
multisim变压器反馈式_穿过隔离栅供电:认识隔离式直流/ 直流偏置电源
查看>>
mysql csv import meets charset
查看>>
multivariate_normal TypeError: ufunc ‘add‘ output (typecode ‘O‘) could not be coerced to provided……
查看>>
MySQL DBA 数据库优化策略
查看>>
multi_index_container
查看>>
mutiplemap 总结
查看>>
MySQL Error Handling in Stored Procedures---转载
查看>>