await

作者: Time_Notes | 来源:发表于2020-07-28 15:25 被阅读0次

await allows us to wait for the response of an asynchronous request.

The await keyword before a promise makes JavaScript wait until that promise settles, and then:

1.If it’s an error, the exception is generated, same as if throw error were called at that very place.

2.Otherwise, it returns the result, so we can assign it to a value.

async/await allows us to program using asynchronous requests in a "synchronous" manner using the modern versions of Javascript.


为什么要用await:为了使异步代码,更像同步的代码

解决了什么问题

在async/await之前,有三种方式写异步代码

1.嵌套回调

2.以Promise为主的链式回调

3.使用Generators

但这三种写起来都不够优雅,ES7做了优化改进,async/await应运而生。

相比较Promise对象then函数的嵌套,与Generator 执行的繁琐(需要借助co才能自动执行,否则得手动调用next方法),Async/Await可以轻松写出同步风格的代码同时又拥有异步机制,更加简洁,逻辑更加清晰。


await等到之后,做了一件什么事情?

右侧表达式的结果,就是await要等的东西。

等到之后分2个情况

1.不是promise对象

如果不是promise,await会阻塞后面的代码,先执行async外面的同步代码,同步代码执行完,再回到async内部,把这个非promise的东西,作为await表达式的结果。

2.是promise对象

如果它等到的是一个promise对象,await也会暂停后面的代码,先执行async外面的同步代码,等着Promise对象fulfilled,然后把resolve的参数作为await表达式的运算结果。

如果asycn里的代码都是同步的,那么这个函数被调用就会同步执行


1)await对于结果的处理:await是个运算符,用于组成表达式,await表达式的运算结果取决于它等的东西。

1.如果它等到的不是一个Promise对象,那么await表达式的运算结果就是它等到的东西;

2.如果它等到的是一个Promise对象,await就忙起来了,它会阻塞其后面的代码,等着Promise对象resolve,然后得到resolve的值,作为await表达式的运算结果。

虽然是阻塞,但async函数调用并不会造成阻塞,它内部所有的阻塞都被封装在一个Promise对象中异步执行,这也正是await必须用在async函数中的原因;

2)await对于失败消息的处理:await只关心异步过程成功的消息resolve(data),拿到相应的数据data;至于失败消息reject(error),不关心不处理;

对于错误的处理有以下几种方法供选择:

(1)让await后面的Promise对象自己catch;

(2)也可以让外面的async函数返回的Promise对象统一catch;

(3)像同步代码一样,放在一个try...catch结构中;

//这是React Native的回调函数,加个async关键字没有任何影响,但是可以用await关键字

 将异步和同步的代码放在一个try..catch中,异常都能抓到

async componentDidMount(){

    try{

        let array=null;

        //这里用await关键字,就能拿到结果值;没有await的话,只能拿到Promise对象

        let data=await asyncFunction();

        if(array.length>0){

            array.push(data);     //这里会抛出异常,下面的catch也能抓到

        }

    }catch(error){

        alert(JSON.stringify(error))

    }

}


await内部的原理?

当执行await语句时,线程,cpu,内存都发生了什么。

await发生异常了还能不能继续往下执行

await如何捕获异常

相关文章

  • async和await

    浅谈Async/Await用 async/await 来处理异步 async和await async:声明一个异步...

  • JS 中的 async/await

    async/await 是什么? async/await 是 ES2017 中新增的异步解决方案; await 只...

  • vue for 循环中使用 await

    vue for 循环中使用 await(转) await 和 async必须成对出现,如果调用await的地方,无...

  • ES8(一) —— async&await

    目录 async和普通函数的区别 await async/await处理多回调异步 async和await必须配合...

  • 小程序-云开发

    async和await async:异步(无等待)await:等待(是为了同步) 一、await 关键字只在 as...

  • ES6中的好东西

    1 Await/Async 前端的回调时代我没有赶上,我赶上的是await/async时代。await和async...

  • 理解async/await

    async/await:用同步的思维解决异步问题,等待await执行结果出来之后,才会继续向下执行 await 1...

  • Vue接口调用方式(三)async/await用法

    async/await用法 1. async/await的基本用法 async/await是ES7引入的新语法,可...

  • 学习asyncio

    关键字await将控制权移交给event loop。 一、await关键字 二、async和await的语法 三、...

  • js循环中的异步

    for循环await、async这样就没问题foreach不支持await,asyncmap:

网友评论

      本文标题:await

      本文链接:https://www.haomeiwen.com/subject/demfrktx.html