es7中的async、await使用方法示例详解

 更新时间:2023年01月27日 10:07:00   投稿:yin  
async、await是es7里面的新语法,async申明一个function是异步,而await等待一个异步方法执行完成。替代promise中的then。async函数返回一个Promise对象,当函数执行的时候,一旦遇到await就会先返回,等到触发的异步操作完成,再接着执行函数体内后面的语句。

async、await 是es7里面的新语法,它的作用就是 async 用于申明一个 function 是异步的,而 await 用于等待一个异步方法执行完成。它可以很好的替代promise 中的then。async 函数返回一个 Promise 对象,可以使用then 方法添加回调函数。当函数执行的时候,一旦遇到await 就会先返回,等到异步操作完成,再接着执行函数体内后面的语句。

一、前言

回调是JavaScript在es5之前处理异步方法的常用方式,当异步调用又调用了异步方法时,前端的小伙伴们应该都遇到过这种场景吧,回调方式的写法让人看得头皮发麻,代码的可读性非常差

ES2015中引入Promise, 目的就是为了解决著名的回调地狱,但是它自己引入了语法复杂性。示例如下:

function takeLongTime() {
    return new Promise(resolve => {
        setTimeout(() => resolve("long_time_value"), 1000);
    });
}
 
takeLongTime().then(v => {
    console.log("got", v);
});

ES2017增加了异步函数async/await,提高了代码可读性,让调用异步方法像同步一样简单。示例如下:

function takeLongTime() {
    return new Promise(resolve => {
        setTimeout(() => resolve("long_time_value"), 1000);
    });
}
 
async function test() {
    const v = await takeLongTime();
    console.log(v);
}
 
test();

async/await使代码看起来像是同步的,但它在后台是异步和非阻塞的。可以理解 await 后面的语句相当于放到了 new Promise 中,下一行及之后的语句相当于放在 Promise.then 中。 async 会将其后的函数(函数表达式或 Lambda)的返回值封装成一个 Promise 对象,而 await 会等待这个 Promise 完成,并将其 resolve 的结果返回出来。

二、async 和 await 的基础使用

async/awiat 的使用规则:

    async 返回的是一个 Promise 成功的对象,await 就是等待这个 promise 的返回结果后,再继续执行
    await 等待的是一个 Promise 对象,后面必须跟一个 Promise 对象,但是不必写 then (),直接就可以得到返回值

但注意,await 所等待的 promise 对象,他的最终状态一定是 resolve 的(当然也可以不是 resolve ,只不过不会执行后面的代码罢了),否则不会执行await 后面的代码,也就是不会去执行所谓的 then() ;

三、async \ await使用场景

//将请求改造成一个通用函数
function request(options) {
    //.....
    return new Promise(....); //使用Promise执行请求,并返回Promise对象
}
//于是我们就可以来发送请求了
request("ajaxA")
.then((data)=>{
   //处理data
   return request("ajaxB")
})
.then((data)=>{
   //处理data
   return request("ajaxC")
})
.then((data)=>{
   //处理data
   return request("ajaxD")
})

如果能像使用同步代码那样, 使用Promise就好了。于是, async \ await出现了

function request(options) {
    //.....
    return new Promise(....); //使用Promise执行请求,并返回Promise对象
}
//wait这个单词是等待的意思
async function load(){
    await request("ajaxA");  //那么这里就是在等待ajaxA请求的完成
    await request("ajaxB");
    await request("ajaxC");
    await request("ajaxD");
}

await关键字使用的要求非常简单, 后面调用的函数要返回一个Promise对象。load()这个函数已经不再是普通函数, 它出现了await这样"阻塞式"的操作 因此async关键字在这是不能省略的。与之前长长的then链和then方法里的回调函数相比,这样的写法看起来像是同步写法并且更加清爽,更加符合编程习惯。

四、await返回打印测试

await后面的promise状态不是resolve的输出结果

async function async1 () {
  console.log('async1 start');
  await new Promise(resolve => {
    console.log('promise1');
  })
  console.log('async1 success');
  return 'async1 end'
}
console.log('srcipt start')
async1().then(res => console.log(res))
console.log('srcipt end')

/* await后面的promise状态不是resolve的输出结果
"srcipt start"
"async1 start"
"promise1"
"srcipt end"
*/

这里我们可以看到:在 async1 中 await 后面的 Promise 是没有返回值的,也就是它的状态始终是 pending 状态,所以在 await 之后的内容是不会执行的,包括 async1 后面的 .then。

await后面的promise状态是resolve的输出结果

async function async1 () {
  console.log('async1 start');
  await new Promise(resolve => {
    console.log('promise1');
    resolve()
  })
  console.log('async1 success');
  return 'async1 end'
}
console.log('srcipt start')
async1().then(res => console.log(res))
console.log('srcipt end')

/*await后面的promise状态是resolve的输出结果
"srcipt start"
"async1 start"
"promise1"
"srcipt end"
"async1 success"
"async1 end"
*/

五、总结

解决函数回调经历了几个阶段, Promise 对象, Generator 函数到async函数。async函数目前是解决函数回调的最佳方案。很多语言目前都实现了async,包括Python ,java spring,go等。

async 函数返回一个 Promise 对象,当函数执行的时候,一旦遇到 await 就会先返回,等到触发的异步操作完成,再接着执行函数体内后面的语句。

到此这篇关于es7中的async、await使用方法示例详解的文章就介绍到这了,更多相关async、await使用示例内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 利用PHP实现递归删除链表元素的方法示例

    利用PHP实现递归删除链表元素的方法示例

    这篇文章主要给大家介绍了关于如何利用PHP实现递归删除链表元素的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • 基于ES6 Array.of的用法(实例讲解)

    基于ES6 Array.of的用法(实例讲解)

    下面小编就为大家带来一篇基于ES6 Array.of的用法(实例讲解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • Echarts自定义地图和添加图标代码示例

    Echarts自定义地图和添加图标代码示例

    这篇文章主要给大家介绍了关于Echarts自定义地图和添加图标的相关资料,项目中经常会遇到需要渲染echarts地图的情况,文中通过代码示例介绍的非常详细,需要的朋友可以参考下
    2023-09-09
  • 基于JavaScript实现瀑布流效果(循环渐近)

    基于JavaScript实现瀑布流效果(循环渐近)

    本文给大家介绍基于javascript实现循环渐近瀑布流效果,代码简单易懂,非常具有参考价值,需要的朋友参考下吧
    2016-01-01
  • ES6入门教程之变量的解构赋值详解

    ES6入门教程之变量的解构赋值详解

    这篇文章主要给大家介绍了关于ES6入门教程之变量的解构赋值的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用ES6具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-04-04
  • JavaScript前端面试扁平数据转tree与tree数据扁平化

    JavaScript前端面试扁平数据转tree与tree数据扁平化

    这篇文章主要为大家介绍了JavaScript面试中扁平数据转tree以及tree数据扁平化示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • javascript实现的鼠标链接提示效果生成器代码

    javascript实现的鼠标链接提示效果生成器代码

    javascript实现的鼠标链接提示效果生成器代码...
    2007-06-06
  • JavaScript实现即时通讯的 4 种方案

    JavaScript实现即时通讯的 4 种方案

    这篇文章主要给大家分享了JavaScript实现即时通讯的 4 种方案,其实就是服务端如何将数据推送到浏览器,下面详细的文章内容,需要的小伙伴参考一下,洗碗给对你有所帮助
    2022-02-02
  • JavaScript二叉搜索树构建操作详解

    JavaScript二叉搜索树构建操作详解

    这篇文章主要介绍了JavaScript二叉搜索树构建操作详解,文章围绕主题展开二叉搜索树的性质以及二叉搜索树的构建、查找和删除等内容,需要的小伙伴可以参考一下
    2022-07-07
  • JS写XSS cookie stealer来窃取密码的步骤详解

    JS写XSS cookie stealer来窃取密码的步骤详解

    JavaScript是web中最常用的脚本开发语言,js可以自动执行站点组件,管理站点内容,在web业内实现其他有用的函数。这篇文章主要介绍了JS写XSS cookie stealer来窃取密码的步骤详解,需要的朋友可以参考下
    2017-11-11

最新评论