一、Promise
1.什么是Promise?
Promise是es6中专门用来处理异步回调的,可以解决回调地狱。
Promise是一个构造函数,这个构造函数中放一个回调函数作为参数,这个回调函数中放的是异步的操作,对于一个异步操作来说执行是需要时间的,所以一开始Promise是一个pending状态,到了一定的条件就会变成fulfilled(成功)或者reject(失败的状态) 在成功的时候我们执行resolve回调函数,其实调用的是.then里的回调,在失败的时候执行reject回调函数其实调用的是catch回调,说白了 promise就是把原来的回调函数嵌套在里面的写法变成了链式写法。
2.Promise的三种状态
1)pending 初始状态 等待
2)fulfilled 成功状态
3)rejected 失败状态
3.Promise的方法
all()方法: Promise 的 all 方法提供了并行执行异步操作的能力,并且在所有异步操作执行完后才执行回调。
race()方法: race 按字面解释,就是赛跑的意思。race 的用法与 all 一样,只不过 all 是等所有异步操作都执行完毕后才执行 then 回调。而 race 的话只要有一个异步操作执行完毕,就立刻执行 then 回调。
4.Promise的应用场景
封装ajax,axios的get,post封装
微信小程序中封装wx.request()
二、async、await
async 和 await 是一种同步的写法,执行异步的操作
1.特点
1)async的用法,它作为一个关键字放到函数前面,这样普通函数就变为了异步函数
2)异步async函数调用,跟普通函数的使用方式一样
3)异步async函数返回一个promise对象
4)async函数配合await关键字使用(阻塞代码往下执行)是异步方法,但是阻塞式的
2.优点
1)同步代码编写方式: Promise使用then函数进行链式调用,async/await从上到下,顺序执行,就像写同步代码一样,更符合代码编写习惯;
2)多个参数传递: Promise的then函数只能传递一个参数,async可以同时传递多个参数
3)同步代码和异步代码可以一起编写:当然,异步过程需要包装成一个Promise对象放在await关键字后面;
4)async/await是对Promise的优化: async/await是基于Promise的,是进一步的一种优化,不过在写代码时,Promise本身的API出现得很少,很接近同步代码的写法;
3.应用场景
async主要来处理异步的操作,可以处理回调地狱
需求:执行第一步,将执行第一步的结果返回给第二步使用。在ajax中先拿到一个接口的返回数据,然后使用第一步返回的数据执行第二步操作的接口调用,达到异步操作。
三、generator函数详解
此处原文链接:https://blog.csdn.net/superfjj/article/details/111332726
1.定义
Generator 函数是 ES6 提供的一种异步编程解决方案
从语法上,首先可以把它理解成,Generator函数是一个状态机,封装了多个内部状态
执行 Generator 函数会返回一个遍历器对象.
yield
遍历器对象的next方法的运行逻辑如下:
(1)遇到yield语句,就暂停执行后面的操作,并将紧跟在yield后面的那个表达式的值,作为返回的对象的value属性值。
(2)下一次调用next方法时,再继续往下执行,直到遇到下一个yield语句。
(3)如果没有再遇到新的yield语句,就一直运行到函数结束,直到return语句为止,并将return语句后面的表达式的值,作为返回的对象的value属性值。
(4)如果该函数没有return语句,则返回的对象的value属性值为undefined。
注意,yield句本身没有返回值,或者说总是返回undefined。
next方法可以带一个参数,该参数就会被当作上一个yield语句的返回值。
function * f() {
for( let i =0; true; i++){
let reset = yield i;
if(reset){
i = -1;
}
}
}
let g = f();
console.log(g.next());
console.log(g.next());
console.log(g.next(true));
输出结果:
{ value: 0, done: false }
{ value: 1, done: false }
{ value: 0, done: false }
异步操作的同步化表达
Generator函数的暂停执行的效果,意味着可以把异步操作写在yield语句里面,等到调用next方法时再往后执行。这实际上等同于不需要写回调函数了,因为异步操作的后续操作可以放在yield语句下面,反正要等到调用next方法时再执行。所以,Generator函数的一个重要实际意义就是用来处理异步操作,改写回调函数。
Generator 的异步应用
什么是异步应用呢?
所谓"异步",简单说就是一个任务不是连续完成的,可以理解成该任务被人为分成两段,先执行第一段,然后转而执行其他任务,等做好了准备,再回过头执行第二段。
比如,有一个任务是读取文件进行处理,任务的第一段是向操作系统发出请求,要求读取文件。然后,程序执行其他任务,等到操作系统返回文件,再接着执行任务的第二段(处理文件)。这种不连续的执行,就叫做异步。
相应地,连续的执行就叫做同步。由于是连续执行,不能插入其他任务,所以操作系统从硬盘读取文件的这段时间,程序只能干等着。
ES6诞生以前,异步编程的方法,大概有下面四种。
回调函数
事件监听
发布/订阅
Promise 对象