博客
关于我
图解 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
查看>>
MTK Android 如何获取系统权限
查看>>
MySQL - 4种基本索引、聚簇索引和非聚索引、索引失效情况、SQL 优化
查看>>
MySQL - ERROR 1406
查看>>
mysql - 视图
查看>>
MySQL - 解读MySQL事务与锁机制
查看>>
MTTR、MTBF、MTTF的大白话理解
查看>>
mt_rand
查看>>
mysql -存储过程
查看>>
mysql /*! 50100 ... */ 条件编译
查看>>
mudbox卸载/完美解决安装失败/如何彻底卸载清除干净mudbox各种残留注册表和文件的方法...
查看>>
mysql 1264_关于mysql 出现 1264 Out of range value for column 错误的解决办法
查看>>
mysql 1593_Linux高可用(HA)之MySQL主从复制中出现1593错误码的低级错误
查看>>
mysql 5.6 修改端口_mysql5.6.24怎么修改端口号
查看>>
MySQL 8.0 恢复孤立文件每表ibd文件
查看>>
MySQL 8.0开始Group by不再排序
查看>>
mysql ansi nulls_SET ANSI_NULLS ON SET QUOTED_IDENTIFIER ON 什么意思
查看>>
multi swiper bug solution
查看>>
MySQL Binlog 日志监听与 Spring 集成实战
查看>>
MySQL binlog三种模式
查看>>