js中A函式呼叫B函式,使用async/await的區別
阿新 • • 發佈:2021-11-17
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 */