博客
关于我
图解 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/

你可能感兴趣的文章
MySQL 报错:Duplicate entry 'xxx' for key 'UNIQ_XXXX'
查看>>
Mysql 拼接多个字段作为查询条件查询方法
查看>>
mysql 排序id_mysql如何按特定id排序
查看>>
Mysql 提示:Communication link failure
查看>>
mysql 插入是否成功_PDO mysql:如何知道插入是否成功
查看>>
Mysql 数据库InnoDB存储引擎中主要组件的刷新清理条件:脏页、RedoLog重做日志、Insert Buffer或ChangeBuffer、Undo Log
查看>>
mysql 数据库中 count(*),count(1),count(列名)区别和效率问题
查看>>
mysql 数据库备份及ibdata1的瘦身
查看>>
MySQL 数据库备份种类以及常用备份工具汇总
查看>>
mysql 数据库存储引擎怎么选择?快来看看性能测试吧
查看>>
MySQL 数据库操作指南:学习如何使用 Python 进行增删改查操作
查看>>
MySQL 数据库的高可用性分析
查看>>
MySQL 数据库设计总结
查看>>
Mysql 数据库重置ID排序
查看>>
Mysql 数据类型一日期
查看>>
MySQL 数据类型和属性
查看>>
mysql 敲错命令 想取消怎么办?
查看>>
Mysql 整形列的字节与存储范围
查看>>
mysql 断电数据损坏,无法启动
查看>>
MySQL 日期时间类型的选择
查看>>