• js中A函数调用B函数,使用async/await的区别


    背景,需要发起一个网络请求(setTimeout模拟),3秒得到结果。

    要求必须在这个网路请求之后才能访问请求到的数据myRes。

    要求调用方f4() 和 发起网络请求的f3()都必须用async/await

    假如f4()不用async/await,f3()用。代码执行到promise内部,执行完setTimeout加到宏任务-->输出“promise1000”,再遇见then加入到微任务。此时就跳出了await外部对应的async函数,继续执行同步代码"console.log(myRes+1);",这个时候myRes还没有有从网络获取到值“999”。

    promise 3000
    1
    setTimeout 3000ms
    result 999
    f3 最后一行

    假如f4()用,f3()不用。

    promise 3000
    f3 最后一行
    1
    setTimeout 3000ms
    result 999

    这两种情况在访问myRes的数值的时候“console.log(myRes+1);”,都还是原来的值“1”。

     
    let myRes = 0;
    async function f3() {// 模拟网络请求 console.log("f3"); let t=3000; await new Promise((res,rej)=>{ setTimeout(()=>{ console.log(`setTimeout ${t}ms`); res(999); } , t); console.log(`promise ${t}`); } ).then((result)=>{ myRes = result; console.log(`result ${result}`); } ); console.log("f3 最后一行") }; async function f4() { await f3(); console.log(myRes+1) } f4() // then后面部分需要等到前面promise执行完毕,才会加到queue // 在f4()中await后面紧跟的函数f3(),如果该函数f3()内部有promise: // 如果在f4()中,f4()想要f3()内部的promise和`console.log("f3 最后一行")`都执行结束过后,才执行await f3()的下一步" console.log(myRes+1)",那么f3()内的promise之前需要用await // 这种需求,f4()和f3()都需要用async/await

    结果

    f3
    promise 3000
    setTimeout 3000ms
    result 999
    f3 最后一行
    1000

    1. tt()采用async/await,f()采用async/await.

    会等到f()完全执行结束,才会输出“ffffffff”

    console.log("code begin");
    async function f() {
        console.log("f")
        await new Promise((res, rej) => {
            let t = 1000;
            setTimeout(() => {
                console.log(`setTimeout ${t}ms`);
                res(777);
    
            }
                , t);
            console.log(`promise ${t}`);
        })
            .then((result) => {
                console.log(`result ${result}`)
            }
            );
        console.log("f-2")
    }
    
    async function tt() {
        await f()
        console.log("ffffffff")
    }
    console.log("f1")
    tt();
    console.log("code end");
    
    
    // 1、tt()采用async/await,f()采用async/await.
    // 会等到f()完全执行结束,才会输出“ffffffff”
    // async function tt() {
    //     await f()
    //     console.log("fffffffff")
    // }
    /**
    f1
    f
    promise 1000
    code end
    setTimeout 1000ms
    result 777
    f-2
    ffffffff */

    2. tt()不用(×)async/await,f()采用async/await。

    tt()此时是同步代码,“ffffffff”会先于“code end”输出
    console.log("code begin");
    async function f() {
        console.log("f")
        await new Promise((res, rej) => {
            let t = 1000;
            setTimeout(() => {
                console.log(`setTimeout ${t}ms`);
                res(777);
    
            }
                , t);
            console.log(`promise ${t}`);
        })
            .then((result) => {
                console.log(`result ${result}`)
            }
            );
        console.log("f-2")
    }
    
    async function tt() {
        f()
        console.log("ffffffff")
    }
    console.log("f1")
    tt();
    console.log("code end");
    
    // 2、tt()不用(×)async/await,f()采用async/await。
    // tt()此时是同步代码,“ffffffff”会先于“code end”输出
    // async function tt() {
    //     f()
    //     console.log("ffffffff")
    // }
    
    /**
    f1
    f
    promise 1000
    ffffffff
    code end
    setTimeout 1000ms
    result 777
    f-2 */

    3. tt()采用async/await,f()不采用(×)async/await.

    console.log("code begin");
    async function f() {
        console.log("f")
        new Promise((res, rej) => {
            let t = 1000;
            setTimeout(() => {
                console.log(`setTimeout ${t}ms`);
                res(777);
    
            }
                , t);
            console.log(`promise ${t}`);
        })
            .then((result) => {
                console.log(`result ${result}`)
            }
            );
        console.log("f-2")
    }
    
    async function tt() {
        await f()
        console.log("ffffffff")
    }
    console.log("f1")
    tt();
    console.log("code end");
    
    // 3、tt()采用async/await,f()不采用(×)async/await.
    
    // 正确
    // code begin
    // f1
    // f
    // promise 1000
    // f-2
    // code end  
    //因为Promise中用了setTimeout,“code end”输出后,不会执行setTimeout(宏任务)中的console,所以也不执行then(微任务)。
    // (因为then必须等到Promise中所有内容执行完毕,setTimeout在Promise内部,所以then必须等到setTimeout执行完毕);
    // 那tt()采用了async/await(awwit f()),为什么不等到f()执行完毕呢?
    // 答:因为f()内部没有像第一点那样采用await Promise,其实f()已经执行完了,你看“f-2”都已经输出了。
    // 如果Promise中没用用setTimeout,那么输出的情况将会是下面标记为【去掉setTimeout】的结果。
    // ffffffff
    // setTimeout 1000ms
    // result 777
    
    console.log("code begin");
    async function f() {
        console.log("f")
        new Promise((res, rej) => {
            let t = 1000;
            // setTimeout(() => {
                // console.log(`setTimeout ${t}ms`);
                res(777);
    
            // }
                // , t);
            console.log(`promise ${t}`);
        })
            .then((result) => {
                console.log(`result ${result}`)
            }
            );
        console.log("f-2")
    }
    
    async function tt() {
        await f()
        console.log("ffffffff")
    }
    console.log("f1")
    tt();
    console.log("code end");
    
    // 【去掉setTimeout】
    // code begin
    // f1
    // f
    // promise 1000
    // f-2
    // code end
    // result 777
    // ffffffff

    4. tt()不采用(×)async/await,f()不采用(×)async/await.

     
    console.log("code begin");
    async function f() {
        console.log("f")
        new Promise((res, rej) => {
            let t = 1000;
            setTimeout(() => {
                console.log(`setTimeout ${t}ms`);
                res(777);
    
            }
                , t);
            console.log(`promise ${t}`);
        })
            .then((result) => {
                console.log(`result ${result}`)
            }
            );
        console.log("f-2")
    }
    
    async function tt() {
        f()
        console.log("ffffffff")
    }
    console.log("f1")
    tt();
    console.log("code end");
    
    // 4、tt()不采用(×)async/await,f()不采用(×)async/await.
    // code begin
    // f1
    // f
    // promise 1000
    // f-2
    // ffffffff
    // code end
    // setTimeout 1000ms
    // result 777
    
    
    // 注释掉setTimeout
    console.log("code begin");
    async function f() {
        console.log("f")
        new Promise((res, rej) => {
            let t = 1000;
            // setTimeout(() => {
                // console.log(`setTimeout ${t}ms`);
                res(777);
    
            // }
                // , t);
            console.log(`promise ${t}`);
        })
            .then((result) => {
                console.log(`result ${result}`)
            }
            );
        console.log("f-2")
    }
    
    async function tt() {
        f()
        console.log("ffffffff")
    }
    console.log("f1")
    tt();
    console.log("code end");
    // code begin
    // f1
    // f
    // promise 1000
    // f-2
    // ffffffff
    // code end
    // result 777
    /**function f1() { asyncFunc() }
    async function f2() { await asyncFunc() }
    
    await f1() // 不会等待asyncFunc(),如果asyncFunc()返回rejection,直接触发 unhandledrejection
    await f2() // 会等待asyncFunc(),如果asyncFunc()返回rejection,会转回成错误并向上传播
    
    链接:https://www.zhihu.com/question/462421951/answer/1916281835
     */
  • 相关阅读:
    gitlab11.5.4 配置邮件提醒
    docker 安装 mongodb
    dd测试
    k8s部署rocketmq 双主
    rocketmq 多master集群部署
    Kubernetes中的Taint污点和Toleration容忍
    Zookeeper分布式集群搭建
    初识ZooKeeper
    hdu 5071(2014鞍山现场赛B题,大模拟)
    hdu 5073
  • 原文地址:https://www.cnblogs.com/sunupo/p/15568068.html
Copyright © 2020-2023  润新知