promise/async/await/generator

2 篇文章 0 订阅

一、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

asyncawait 是一种同步的写法,执行异步的操作

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 对象

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值