您好,登錄后才能下訂單哦!
這篇“ES6中Promise、async和await面試題實例代碼分析”文章的知識點大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“ES6中Promise、async和await面試題實例代碼分析”文章吧。
JS 執(zhí)行順序:單線程,自上而下、先同步后異步、先微任務(wù)后宏任務(wù)
new promise() -> Promise.resolve(),觸發(fā)then
new promise((reject)=>{reject()}) -> promise.reject(),觸發(fā)catch
then 和 catch 內(nèi)部沒有 throw new Error 相當于 resolve
async function 相當于返回 Promise.resolve()
await 后面的代碼都是異步的,微任務(wù);setTimeout是宏任務(wù)
初始化Promise時,函數(shù)內(nèi)部代碼會被立即執(zhí)行
考點1:Promise.resolve、Promise.reject執(zhí)行順序
Promise.resolve().then(() => { // 優(yōu)先尋找then console.log(1); }).catch(() => { console.log(2); }) // 1
Promise.reject().then(() => { // 優(yōu)先尋找catch console.log(1); }).catch(() => { console.log(2); }) // 2
考點2:then 和 catch 內(nèi)部沒有 throw new Error() 相當于 resolve
Promise.resolve().then(() => { console.log(1); }).catch(() => { console.log(2); }).then(() => { console.log(3); }) // 1 3
Promise.reject().then(() => { console.log(1); }).catch(() => { console.log(2); }).then(() => { console.log(3); }) // 2 3
Promise.reject().then(() => { console.log(1); }).catch(() => { console.log(2); throw new Error(); }).then(() => { console.log(3); }) // 2 報錯
Promise.reject().then(() => { console.log(1); }).catch(() => { console.log(2); throw new Error(); }).then(() => { console.log(3); }).catch(() => { console.log(4); }) // 2 4
考點3:async function -> 相當于返回一個 Promise.resolve
const res = async function fn() { return 100; } console.log(res()); // 返回一個resolve狀態(tài)的Promise對象 Promise {<fulfilled>: 100} res().then(()=>{ console.log(0); }).catch(()=>{ console.log(1); }) // 0 (async function () { const a = fn(); const b = await fn(); console.log(a); // Promise {<fulfilled>: 100} console.log(b); // 100 })()
考點4: await 代碼執(zhí)行順序
async function fn1() { console.log("fn1 start"); await fn2(); console.log("fn1 end"); } async function fn2() { console.log("fn2 start"); } console.log("start"); fn1(); console.log("end"); /** * 打印順序: * start * fn1 start * fn2 start * end * fn1 end */
async function fn1() { console.log("fn1 start"); await fn2(); console.log("fn1 end"); await fn3(); console.log("fn3 end"); } async function fn2() { console.log("fn2"); } async function fn3() { console.log("fn3"); } console.log("start"); fn1(); console.log("end"); /** * 打印順序: * start * fn1 start * fn2 * end * fn1 end * fn3 * fn3 end */
考點5:Promise 與 setTimeout 執(zhí)行順序
console.log("start"); setTimeout(()=>{ console.log("setTimeout") }); Promise.resolve().then(()=>{ console.log("Promise") }) console.log("end") /** * 打印順序: * start * end * Promise * setTimeout */
async function fn1() { console.log("fn1 start"); await fn2(); console.log("fn1 end"); // await后面的代碼為"微任務(wù)代碼" } async function fn2() { console.log("fn2"); } console.log("start"); setTimeout(()=>{ console.log("setTimeout"); // 宏任務(wù) }); fn1(); console.log("end"); /** * 打印順序: * start * fn1 start * fn2 * end * fn1 end * setTimeout */
昨天看了一道字節(jié)外包的面試題
const list = [1, 2, 3]; const square = num => { return new Promise((resolve, reject) => { setTimeout(() => { resolve(num * num); }, 1000); }); } function test() { // 修改這里的代碼 list.forEach(async x => { const res = await square(x); console.log(res); }); } test()
需要修改的是把同步執(zhí)行的數(shù)組替換成換成異步打印。
在測試以后我們可以-驗證,forEach和for循環(huán)不同的是for循環(huán)可以修改數(shù)組的值,且forEach取不到具體某一項的值,這里的異步說的是每執(zhí)行一次數(shù)組循環(huán),就執(zhí)行一步test()方法,
const list = [1, 2, 3]; const square = num => { return new Promise((resolve, reject) => { setTimeout(() => { resolve(num * num); }, 1000); }); } function test() { for(let x of list) { var res = await square(x) console.log(res) } } test()
以上就是關(guān)于“ES6中Promise、async和await面試題實例代碼分析”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對大家有幫助,若想了解更多相關(guān)的知識內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。