1. 程式人生 > 其它 >js中A函式呼叫B函式,使用async/await的區別

js中A函式呼叫B函式,使用async/await的區別

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
 */