Promise,generator,async和await

同步任务

前一个任务结束后再执行后一个任务,程序的执行顺序与任务的排列顺序是一致的、同步的。

异步任务

异步任务由JavaScript 委托给宿主环境进行执行 
当同步任务执行完成后,会通知JavaScript 主线程执行异步任务的回调函数

4313deb6a8484c1cb6bdfc600aa2faf8.png

030e35524e7d4293ab62663ba2618c9f.png 

 

额外的两个方法

1.process.nextTick

同步任务执行完执行的

2.setImmediate

当前事件循环结束后执行的


宏任务与微任务

(异步任务可以再划分为宏任务和微任务)

宏任务

计时器,Ajax(前后端数据交互),读取文件

微任务

promise.then


执行顺序

  1. 先执行同步任务
  2. 执行process.nextTick
  3. 执行微任务
  4. 执行宏任务
  5. 执行setImmediate

回调地狱

异步任务需要执行回调函数(es5通过回调函数拿到异步数据)解决,多个任务需要控制顺序执行的时候就会出现函数的嵌套,那么执行回调函数就会出现回调地狱。

局限性:代码不方便维护


为了解决回调地狱出现了Promise对象

解决异步编程(如利用then解决回调地狱问题)

语法如下:

let p = new Promise(function(resolve,reject){

       resolve("hello world");

        reject("fail")

 })

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

     p.then(function(data){

                        console.log(data)},

            function(reason){

                     console.error(reason)}

)

 

 resolve可以将异步数据传递出来,reject为失败

(es6)通过then可以拿到异步数据


Promise的三种状态

  1. pendind(进行中)
  2. fulfilled(已成功)
  3. rejected(已失败)

局限

但是写起来也是比较复杂,不太容易维护


于是出现了generator函数『es6提供的异步编程解决方案』来解决promise问题——一直通过then方法链式函数也比较复杂

generator函数中:

1.function关键字和函数名之间有*

2.函数体内部用yield表达式,定义不同的内部状态(类似于promise的then)进行下一步下一步操作


为了更简洁,又出现了async和await函数

async函数

1.返回值是promise对象

2.里面需要写await函数

await函数

1.必须写在async函数里面

2.右边表达式为promise对象

3.await返回的是promise成功的值(直接获取resolve传递出来的异步数据)

4.await的promise失败了,就抛出异常,需要通过try catch来捕获处理

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值