学了ES6,还不会Promise的链式调用?🧐
前言
本文主要讲解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的链式调用?🧐的更多相关文章
- ES6 Promise 的链式调用
1.什么是Promise Promise 对象代表了未来将要发生的事件,用来传递异步操作的消息. 2.对象的状态不受外界影响.Promise 对象代表一个异步操作,有三种状态: pending: 初始 ...
- Promise.then链式调用
let a = new Promise((resolve,reject)=>{ resolve(1) }).then((r)=>{console.log(r)}).then(()=> ...
- Promise 多重链式调用
Promise对象是用于异步操作的. Promise的真正强大之处在于它的多重链式调用,可以避免层层嵌套回调.如果我们在第一次ajax请求后,还要用它返回的结果再次请求呢? 使用Promise,我们就 ...
- 史上最简单的手写Promise,仅17行代码即可实现Promise链式调用
Promise的使用相比大家已经孰能生巧了,我这里就不赘述了 先说说我写的Promise的问题吧,无法实现宏任务和微任务里的正确执行(也就是在Promise里面写setTimeout,setInter ...
- 用Promise实现:带延时功能的链式调用
// 1) 调用方式 new People('whr').sleep(3).eat('apple').sleep(5).eat('durian'); // 2) 打印结果 'hello, whr' - ...
- promise的异步链式调用
场景: 淘米 干净的米下锅 蒸米饭 吃米饭 ;这几个步骤是一个接着一个执行, 也就是只有前面的做完后, 才会去做后面的. 并且每一步都需要用一部分时间去执行. function deal(ta ...
- 在Vue单页面应用中使用Promise链式调用
eg: this.commonLoginFun().then((res) => { if (res.errNo === 0) { const { isLogin } = res.data; if ...
- promise链式调用
var that = this;that.hello().then(res => { return that.world(res);}).then(res => { console.log ...
- ES6学习笔记之Promise
入职百度EFE团队实习已经三周了,实习中接触到了生产环境的技术和开发流程,大开眼界,和自己在学校接小作坊式项目是很不一样的体验.其中一个很大的感触是,ES6早已不是“选修”的尝鲜技术,而是已经全面普及 ...
随机推荐
- 云原生 AI 前沿:Kubeflow Training Operator 统一云上 AI 训练
分布式训练与 Kubeflow 当开发者想要讲深度学习的分布式训练搬上 Kubernetes 集群时,首先想到的往往就是 Kubeflow 社区中形形色色的 operators,如 tf-operat ...
- Django项目使用requirements.txt文件
1.生成requirements.txt pip freeze > requirements.txt 2.使用requirements.txt pip install -r requiremen ...
- 羽夏笔记——Win32(非WinAPI)
写在前面 本笔记是由本人独自整理出来的,图片来源于网络.本人非计算机专业,可能对本教程涉及的事物没有了解的足够深入,如有错误,欢迎批评指正. 如有好的建议,欢迎反馈.码字不易,如果本篇文章有帮助你 ...
- Python - 面向对象编程 - 什么是对象和类
面向对象编程 Object Oriented Programming,简称 OOP,是一种程序设计思想 OOP 把对象作为程序的基本单元,一个对象包含了数据和操作数据的方法 Python里面有一句话: ...
- Java关键字-static汇总
1.静态变量(被static修饰的成员变量) 1-静态变量 运行时,Java虚拟机只为静态变量分配一次内存(加载类的过程中完成静态变量的内存分配) 类的内部可以在任何方法内直接访问静态变量 其他类中可 ...
- 口护万亿市场杀出的实力派 Oclean欧可林
撰文 |懂懂 编辑 | 秦言 来源:懂懂笔记 在"青年必去的电影节"上,发现了一个跟他们打成一片的智能护齿"新星". 25日,备受关注的第15届FIRST青年电 ...
- python 小鸡飞行小游戏
python 小鸡飞行小游戏 用空格键控制小鸡飞行 代码 import pygame.freetype import sys import random pygame.init() screen = ...
- webpack4 使用babel处理ES6语法的一些简单配置
一,安装包 npm install --save-dev babel-loader @babel/corenpm install @babel/preset-env --save-devnpm ins ...
- Mysql实现排序
排序 SELECT obj.user_id,obj.score,@rownum := @rownum + 1 AS rownum FROM ( SELECT ...
- python 深度学习 库文件安装出错汇总
Cython_bbox FairMOT | win10下cython-bbox安装的心酸之路_是阳阳呀的博客-CSDN博客 swig 安装polyiou.py https://blog.csdn.ne ...