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

你可能感兴趣的文章
MySQL5.7.18主从复制搭建(一主一从)
查看>>
MySQL5.7.19-win64安装启动
查看>>
mysql5.7.19安装图解_mysql5.7.19 winx64解压缩版安装配置教程
查看>>
MySQL5.7.37windows解压版的安装使用
查看>>
mysql5.7免费下载地址
查看>>
mysql5.7命令总结
查看>>
mysql5.7安装
查看>>
mysql5.7性能调优my.ini
查看>>
MySQL5.7新增Performance Schema表
查看>>
Mysql5.7深入学习 1.MySQL 5.7 中的新增功能
查看>>
Webpack 之 basic chunk graph
查看>>
Mysql5.7版本单机版my.cnf配置文件
查看>>
mysql5.7的安装和Navicat的安装
查看>>
mysql5.7示例数据库_Linux MySQL5.7多实例数据库配置
查看>>
Mysql8 数据库安装及主从配置 | Spring Cloud 2
查看>>
mysql8 配置文件配置group 问题 sql语句group不能使用报错解决 mysql8.X版本的my.cnf配置文件 my.cnf文件 能够使用的my.cnf配置文件
查看>>
MySQL8.0.29启动报错Different lower_case_table_names settings for server (‘0‘) and data dictionary (‘1‘)
查看>>
MYSQL8.0以上忘记root密码
查看>>
Mysql8.0以上重置初始密码的方法
查看>>
mysql8.0新特性-自增变量的持久化
查看>>