這是我參與8月更文挑戰的第4天,活動詳情查看:8月更文挑戰html
①用promise
解決異步
函數仍然不夠簡潔面試
②promise的then鏈傳遞參數
仍然很複雜promise
promise用來解決回調函數多層嵌套,async/await用來優化promise的多個then鏈調用和傳參問題。markdown
從操做形式上看:Generator 函數的語法糖。async函數就是將 Generator 函數的星號(*)替換成async,將yield替換成await。異步
從功能上看:await命令就是內部then命令的語法糖。async
聲明某個函數是異步函數。函數
做用:async 函數返回的是一個 Promise 對象。
oop
因此若是某個函數返回的自己就是promise的話,不須要使用async聲明。post
若是async聲明的函數不是promise對象,async 會把這個直接量經過 Promise.resolve() 封裝成 Promise 對象。即便沒有返回值,async也會返回Promsie.resolve(undefined)。優化
await只能寫在async函數中
await是一個運算符, 與其後面表達式的值進行運算獲得最終結果,(咱們能夠定義一個變量接受這個結果,傳遞給下一個異步操做做爲參數)。
十分十分重要!!!!!! :
阻塞
後面的代碼,先執行async外面的同步代碼,同步代碼執行完,再回到async內部,把這個非promise的東西,做爲 await表達式的結果。阻塞
後面的代碼,先執行async外面的同步代碼,等着 Promise 對象 resolve,而後獲得 resolve 的值,做爲 await 表達式的運算結果。例:有三個步驟,但每個步驟都須要以前每一個步驟的結果。
function step1(n) {
console.log(`step1 with ${n}`);
return takeLongTime(n);
}
function step2(m, n) {
console.log(`step2 with ${m} and ${n}`);
return takeLongTime(m + n);
}
function step3(k, m, n) {
console.log(`step3 with ${k}, ${m} and ${n}`);
return takeLongTime(k + m + n);
}
複製代碼
寫成 Promise 方式實現:
function doIt() {
console.time("doIt");
const time1 = 300;
step1(time1)
.then(time2 => {
return step2(time1, time2)
.then(time3 => [time1, time2, time3]);
})
.then(times => {
const [time1, time2, time3] = times;
return step3(time1, time2, time3);
})
.then(result => { console.log(`result is ${result}`);
console.timeEnd("doIt");
});
}
doIt();
複製代碼
寫成async/await:
async function doIt() {
console.time("doIt");
const time1 = 300;
const time2 = await step1(time1);
const time3 = await step2(time1, time2);
const result = await step3(time1, time2, time3);
console.log(`result is ${result}`);
console.timeEnd("doIt");
}
doIt();
複製代碼
一道面試題目的執行順序: