await

2020-07-28  本文已影响0人  Time_Notes

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如何捕获异常

上一篇下一篇

猜你喜欢

热点阅读