ES7前端异步玩法:async/await理解

摘要:
async顾名思义是“异步”的意思,async用于声明一个函数是异步的。并且await只能在async函数中使用通常async、await都是跟随Promise一起使用的。这样await得到的就是一个Promise对象;await得到Promise对象之后就等待Promise接下来的resolve或者reject。使用async、await完成异步操作代码可读与写法上更像是同步的,也更容易让人理解。async、await错误处理JavaScript异步请求肯定会有请求失败的情况,上面也说到了async返回的是一个Promise对象。

本文转载于:https://www.cnblogs.com/leungUwah/p/7932912.html

说明:怕原作者链接失效,备份一份

在最新的ES7(ES2017)中提出的前端异步特性:async、await。

什么是async、await?

async顾名思义是“异步”的意思,async用于声明一个函数是异步的。而await从字面意思上是“等待”的意思,就是用于等待异步完成。并且await只能在async函数中使用

通常async、await都是跟随Promise一起使用的。为什么这么说呢?因为async返回的都是一个Promise对象同时async适用于任何类型的函数上。这样await得到的就是一个Promise对象(如果不是Promise对象的话那async返回的是什么就是什么);

await得到Promise对象之后就等待Promise接下来的resolve或者reject。

来看一段简单的代码:

async functiontestSync() {
     const response = await new Promise(resolve =>{
         setTimeout(() =>{
             resolve("async await test...");
          }, 1000);
     });
     console.log(response);
}
testSync();//async await test...

就这样一个简单的async、await异步就完成了。使用async、await完成异步操作代码可读与写法上更像是同步的,也更容易让人理解。

async、await串行并行处理

串行:等待前面一个await执行后接着执行下一个await,以此类推

async functionasyncAwaitFn(str) {
    return await new Promise((resolve, reject) =>{
        setTimeout(() =>{
            resolve(str)
        }, 1000);
    })
}

const serialFn = async () => { //串行执行
console.time('serialFn')
    console.log(await asyncAwaitFn('string 1'));
    console.log(await asyncAwaitFn('string 2'));
    console.timeEnd('serialFn')
}

serialFn();

可以看到两个await串行执行的总耗时为两千多毫秒。

并行:将多个promise直接发起请求(先执行async所在函数),然后再进行await操作。

async functionasyncAwaitFn(str) {
    return await new Promise((resolve, reject) =>{
        setTimeout(() =>{
            resolve(str)
        }, 1000);
    })
}
const parallel = async () => { //并行执行
    console.time('parallel')
    const parallelOne = asyncAwaitFn('string 1');
    const parallelTwo = asyncAwaitFn('string 2')

    //直接打印
console.log(await parallelOne)
    console.log(await parallelTwo)

    console.timeEnd('parallel')


}
parallel()

通过打印我们可以看到相对于串行执行,效率提升了一倍。在并行请求中先执行async的异步操作再await它的结果,把多个串行请求改为并行可以将代码执行得更快,效率更高。

async、await错误处理

JavaScript异步请求肯定会有请求失败的情况,上面也说到了async返回的是一个Promise对象。既然是返回一个Promise对象的话那处理当异步请求发生错误的时候我们就要处理reject的状态了。

在Promise中当请求reject的时候我们可以使用catch。为了保持代码的健壮性使用async、await的时候我们使用trycatch来处理错误。

async functioncatchErr() {
      try{
          const errRes = await new Promise((resolve, reject) =>{
                setTimeout(() =>{
                    reject("http error...");
                 }, 1000);
           );
                //平常我们也可以在await请求成功后通过判断当前status是不是200来判断请求是否成功
                //console.log(errRes.status, errRes.statusText);
        } catch(err) {
             console.log(err);
        }
}
catchErr(); //http error...

免责声明:文章转载自《ES7前端异步玩法:async/await理解》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇quartz定时任务_job实现类中获取传参02Android CTS 测试总结【转】下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

async与await总结

全手打原创,转载请标明出处:https://www.cnblogs.com/dreamsqin/p/11533174.html,多谢,=。=~  抛出3个疑问: 1、async是干哈的? 2、await在等啥? 3、await等到了又要干哈?  先说说AsyncFunction  AsyncFunction构造函数用来创建新的异步函数对象,JavaScri...

4、node中的宏任务和微任务(大活和小活)

执行流程: 宏任务和微任务(一个宏任务配多个微任务):每次执行微任务队列会全部执行完并清空 console.log('main') process.nextTick( () => { console.log('process.nextTick1') }) setTimeout(() => { console.log('setTim...

使用next.js完成从开发到部署

next.js是一个非常棒的轻量级的react同构框架,使用它可以快速的开发出基于服务端渲染的react应用。在next.js官网推荐的是使用now来部署应用,但是对于国内用户或者说是有特殊需求的用户来说,部署到自定义服务器也许是大多数人希望的。借着近期公司官网改版,顺便分享下自己从开发到部署过程中所经历的点点滴滴。 依稀还记得第一次使用next.js是在...

(转)Netty : writeAndFlush的线程安全及并发问题

rocketmq用netty实现的网络连接,发现它多个线程掉用一个channel连接,所以这个是线程安全的? 使用Netty编程时,我们经常会从用户线程,而不是Netty线程池发起write操作,因为我们不能在netty的事件回调中做大量耗时操作。那么问题来了 – 1, writeAndFlush是线程安全的吗? 2, 是否使用了锁,导致并发性能下降呢 我...

SpringMVC的孪生兄弟WebFlux

一、入门文字介绍 官方口水话简短翻译:   Spring WebFlux是一个非阻塞的Web框架,用于利用多核,短时间可一处理大量并发连接。 非阻塞式   在servlet3.1提供了非阻塞的API,WebFlux为之有自己的一套手段,   使用非阻塞的方式可以利用较小的线程或硬件资源来处理并发 函数式编程端点   Spring5必须配备java8,函数式...

ES6 Promise 用法讲解

Promise是一个构造函数,自己身上有all、reject、resolve这几个眼熟的方法,原型上有then、catch等同样很眼熟的方法。 那就new一个 var p = new Promise(function(resolve, reject){ //做一些异步操作 setTimeout(function(){...