一. async/await 相對 promise 的優勢 擁有更通用的作用域,使得代碼有更好的易讀性和可維護性。 由於其鏈式調用,每一個函數都有自己的作用域,如果在多層鏈式調用的層級中,相隔兩層的鏈需要有相互依賴關係,則需要額外的參數傳遞。 場景如下: 假設有 p1 、 p2 、 p3 三個非同步操 ...
一. async/await 相對 promise 的優勢
async/await
擁有更通用的作用域,使得代碼有更好的易讀性和可維護性。
promise
由於其鏈式調用,每一個函數都有自己的作用域,如果在多層鏈式調用的層級中,相隔兩層的鏈需要有相互依賴關係,則需要額外的參數傳遞。
場景如下:
假設有 p1 、 p2 、 p3 三個非同步操作函數, 並且返回的結果都是 promise。
若: p2 依賴於 p1 的結果。 p3 依賴於 p2 和 p1 的結果。採用 promise 鏈式的代碼書寫如下:
p1.then(r1 => Promise.all([r1, p2(r1)]))
.then([r1,r2] => p3(r1, r2))
而用 async/await 的寫法則比較明瞭:
let r1 = await p1();
let r2 = await p2(r1);
let r3 = await p3(r1,r2);
再來一個例子:
有4個返回值為promise的非同步操作函數, p1、p2、p3、p4。
若:p3依賴 p2 的結果, p4 依賴 p1、p3 的結果。
採用 async/await 的寫法如下:
let r1 = await p1();
let r2 = await p2();
let r3 = await p3(r2);
let r4 = await p4(r1,r3);
採用promise的寫法如下:
Promise.all([p1,p2])
.then([r1,r2] => Promise.all([r1, p3(r2)]))
.then([r1,r3] => p4(r1,r3))
以上寫法,promise 的優勢在於p1 、p2 彼此無相關依賴,應該並行執行。 而 await 的寫法沒有做到 p1 、 p2 並行, 故可修改如下:
let r1 = p1();
let r2 = await p2();
let r3 = await p3(r2);
let r4 = await p4(await r1,r3);