ES6中Promise、async和await面試題整理
目錄
- 出題目的:
- 知識(shí)點(diǎn):
- 代碼:
- 附:promise與async await結(jié)合使用
- 總結(jié)
學(xué)習(xí)過(guò)程中遇到的一些基礎(chǔ)的Promise、async、await面試題整理。
出題目的:
- 考察 Promise、async、await 的基礎(chǔ)
- 考察隊(duì)Event Loop、宏任務(wù)、微任務(wù)的理解
知識(shí)點(diǎn):
- JS 執(zhí)行順序:?jiǎn)尉€程,自上而下、先同步后異步、先微任務(wù)后宏任務(wù)
- new promise() -> Promise.resolve(),觸發(fā)then
- new promise((reject)=>{reject()}) -> promise.reject(),觸發(fā)catch
- then 和 catch 內(nèi)部沒(méi)有 throw new Error 相當(dāng)于 resolve
- async function 相當(dāng)于返回 Promise.resolve()
- await 后面的代碼都是異步的,微任務(wù);setTimeout是宏任務(wù)
- 初始化Promise時(shí),函數(shù)內(nèi)部代碼會(huì)被立即執(zhí)行
代碼:
考點(diǎn)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
考點(diǎn)2:then 和 catch 內(nèi)部沒(méi)有 throw new Error() 相當(dāng)于 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 報(bào)錯(cuò)
Promise.reject().then(() => {
console.log(1);
}).catch(() => {
console.log(2);
throw new Error();
}).then(() => {
console.log(3);
}).catch(() => {
console.log(4);
})
// 2 4
考點(diǎn)3:async function -> 相當(dāng)于返回一個(gè) Promise.resolve
const res = async function fn() {
return 100;
}
console.log(res()); // 返回一個(gè)resolve狀態(tài)的Promise對(duì)象 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
})()
考點(diǎn)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
*/
考點(diǎn)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
*/
附:promise與async await結(jié)合使用
昨天看了一道字節(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ù)組替換成換成異步打印。
在測(cè)試以后我們可以-驗(yàn)證,forEach和for循環(huán)不同的是for循環(huán)可以修改數(shù)組的值,且forEach取不到具體某一項(xiàng)的值,這里的異步說(shuō)的是每執(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()
總結(jié)
到此這篇關(guān)于ES6中Promise、async和await面試題整理的文章就介紹到這了,更多相關(guān)ES6 Promise、async、await面試題內(nèi)容請(qǐng)搜索以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持!

網(wǎng)公網(wǎng)安備