前言

本文主要讲解promise的链式调用的方法及其最终方案

应用场景

假如开发有个需求是先要请求到第一个数据,然后根据第一个数据再去请求第二个数据,再根据第二个数据去请求第三个数据...一直到最后得到真正想要的数据,我最初的做法是

setTimeout(() => {
//这里用定时器来代替发请求
//data假设为后台来的数据
let data1 = 1;
console.log(data1);
setTimeout(() => {
let data2 = 2 + data1;
console.log(data2);
setTimeout(() => {
let data3 = 3 + data2;
console.log(data3);
setTimeout(() => {
let data4 = 4 + data3;
console.log(data4);
}, 100);
}, 100);
}, 100);
}, 100);

显然代码是没有任何问题的,但是如果在每次都在获取数据过来还要进行数据的处理呢?那这种代码就变得晦涩难懂且难以维护,搞不好维护你代码的人****。于是这种情况下,Promise就是一个很好的选择。

以上代码就会变成这样的形式

//链式调用
p.then(value=>{ },reason=>{ }).then(value=>{ },reason=>{ })

接下来我们就一起来学习Promise的链式调用吧

实现方法

原理:每次调用then方法都return一个promise对象,因为promise带有then方法,这样就可以在上一个then后面再调用then方法。

const p = new Promise((resolve, reject) => {
let data1 = "data1"; //后台获取到data1
console.log(data1);
resolve(data1);
});
p.then((res) => {
return new Promise((resolve, reject) => {
let data2 = res+"data2"; //后台获取到data2
console.log(data2);
resolve(data2);
});
}).then((res) => {
console.log(res);
});
// data1
// data1data2
// data1data2

看到这里,就会有人问了,这个代码也好看不到哪里去啊,怎么就是一个好的选择了,先等下,还没出最终答案呢

刚刚我们说到,链式调用的原理是每次都在then方法里面返回一个promise对象,通过资料查询,我们会发现Promise的resolve方法返回的就是一个Promise对象

于是刚刚的代码就可以改成下面的形式

const p = new Promise((resolve, reject) => {
let data1 = "data1"; //后台获取到data1
console.log(data1);
resolve(data1);
});
p.then((res) => {
let data2 = res + "data2"; //后台获取到data2
console.log(data2);
return Promise.resolve(data2);
}).then((res) => {
console.log(res);
});
// data1
// data1data2
// data1data2

现在看起来是不是舒服很多,但是其实刚刚搜索resolve方法的时候你还会发现,then方法其实返回的也是一个Promise对象

这样子,最后方案就出来了

const p = new Promise((resolve, reject) => {
let data1 = "data1"; //后台获取到data1
console.log(data1);
resolve(data1);
});
p.then((res) => {
let data2 = res + "data2"; //后台获取到data2
console.log(data2);
return data2;
}).then((res) => {
console.log(res);
});
// data1
// data1data2
// data1data2

万物皆有裂痕,是光进来的地方

参考来源

  • 尚硅谷es6-11视频

学了ES6,还不会Promise的链式调用?🧐的更多相关文章

  1. ES6 Promise 的链式调用

    1.什么是Promise Promise 对象代表了未来将要发生的事件,用来传递异步操作的消息. 2.对象的状态不受外界影响.Promise 对象代表一个异步操作,有三种状态: pending: 初始 ...

  2. Promise.then链式调用

    let a = new Promise((resolve,reject)=>{ resolve(1) }).then((r)=>{console.log(r)}).then(()=> ...

  3. Promise 多重链式调用

    Promise对象是用于异步操作的. Promise的真正强大之处在于它的多重链式调用,可以避免层层嵌套回调.如果我们在第一次ajax请求后,还要用它返回的结果再次请求呢? 使用Promise,我们就 ...

  4. 史上最简单的手写Promise,仅17行代码即可实现Promise链式调用

    Promise的使用相比大家已经孰能生巧了,我这里就不赘述了 先说说我写的Promise的问题吧,无法实现宏任务和微任务里的正确执行(也就是在Promise里面写setTimeout,setInter ...

  5. 用Promise实现:带延时功能的链式调用

    // 1) 调用方式 new People('whr').sleep(3).eat('apple').sleep(5).eat('durian'); // 2) 打印结果 'hello, whr' - ...

  6. promise的异步链式调用

    场景:  淘米  干净的米下锅  蒸米饭  吃米饭 ;这几个步骤是一个接着一个执行, 也就是只有前面的做完后, 才会去做后面的. 并且每一步都需要用一部分时间去执行. function deal(ta ...

  7. 在Vue单页面应用中使用Promise链式调用

    eg: this.commonLoginFun().then((res) => { if (res.errNo === 0) { const { isLogin } = res.data; if ...

  8. promise链式调用

    var that = this;that.hello().then(res => { return that.world(res);}).then(res => { console.log ...

  9. ES6学习笔记之Promise

    入职百度EFE团队实习已经三周了,实习中接触到了生产环境的技术和开发流程,大开眼界,和自己在学校接小作坊式项目是很不一样的体验.其中一个很大的感触是,ES6早已不是“选修”的尝鲜技术,而是已经全面普及 ...

随机推荐

  1. 服务器安装CentOS7.9系统(U盘启动方式)

    一.安装环境 机房的华为GPU服务器,型号G2500,8张P4显卡,需要安装最小化的CentOS7.9操作系统,利用U盘启动的方式进行安装. 二.安装说明 虽然本环境是GPU服务器,但是安装方式同样适 ...

  2. Python3正则表达式学习笔记

    学习前准备:导入re模块 import re 一.re的核心函数 1 - re.compile(pattern[, flags]) 编译正则表达式,速度快 2 - re.match(pattern, ...

  3. 腾讯与Intel就云游戏的探讨

    今天去参加了在腾讯北京总部的腾讯音视频技术 HUB 技术巡回大会,对其中的云游戏应用的探讨格外感兴趣.正巧最近元宇宙概念很火,这篇文章就大会中对云游戏的探讨进行总结和汇报. 讲述一下来自Intel的工 ...

  4. Postman 根据nginx日志查账号

    1) GET:http://fwm.le-yao.com/api/backend/profile 2) Headers中,在KEY中添加 Content-Type ,对应的VALUE为 applica ...

  5. element-ui 弹出组件的遮罩层在弹出层dialog模态框的上面

     造成的原因: 因为dialog的组件外层div设置了 position:absolute: 属性所以导致遮罩层会在最上面. 解决方法: 在属性内加上这段代码 :append-to-body=&quo ...

  6. 【第十五篇】- Maven 依赖管理之Spring Cloud直播商城 b2b2c电子商务技术总结

    Maven 依赖管理 Maven 一个核心的特性就是依赖管理.当我们处理多模块的项目(包含成百上千个模块或者子项目),模块间的依赖关系就变得非常复杂,管理也变得很困难.针对此种情形,Maven 提供了 ...

  7. 珠峰2016,第9期 vue.js 笔记部份

    在珠峰参加培训好年了,笔记原是记在本子上,现在也经不需要看了,搬家不想带上书和本了,所以把笔记整理下,存在博客中,也顺便复习一下 安装vue.js 因为方便打包和环境依赖,所以建意npm  init  ...

  8. 【PHP数据结构】插入类排序:简单插入、希尔排序

    总算进入我们的排序相关算法的学习了.相信不管是系统学习过的还是没有系统学习过算法的朋友都会听说过许多非常出名的排序算法,当然,我们今天入门的内容并不是直接先从最常见的那个算法说起,而是按照一定的规则一 ...

  9. centos8安装php扩展memcached报错

    在php扩展memcached中执行./configure --with-php-config=/usr/local/php/bin/php-config 报错: error: memcached s ...

  10. xml字符串转成数组(php)

    1 $str = '<xml> 2 <ToUserName> <![CDATA[gh_fc0a06a20993]]> </ToUserName> 3 & ...