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

    相关文章

      网友评论

          本文标题:await

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