Promise 物件
1、Promise是非同步程式設計的一種解決方案
2、Promise的兩個特點:物件的狀態不受外界的影響。一旦狀態改變,就不會再變,任何時候都可以得到這個結果。
3、Promise也有一些缺點。首先,無法取消Promise,一旦新建它就會立即執行,無法中途取消。其次,如果不設定回撥函式,Promise內部丟擲的錯誤,不會反應到外部。第三,當處於Pending狀態時,無法得知目前進展到哪一個階段(剛剛開始還是即將完成)
4、Promise物件是一個建構函式,用來生成Promise例項
5、Promise建構函式接受一個函式作為引數,該函式的兩個引數分別是resolve和reject
6、then方法可以接受兩個回撥函式作為引數。第一個回撥函式是Promise物件的狀態變為resolved時呼叫,第二個回撥函式是Promise物件的狀態變為rejected時呼叫。其中,第二個函式是可選的,不一定要提供。這兩個函式都接受Promise物件傳出的值作為引數
7、catch用於指定發生錯誤時的回撥函式let postData = new Promise((resolve, reject) => { if (true) { resolve('success'); } else { reject('error'); } }); postData.then(value => { console.log(111, value); }).catch(value => { console.log(222, value); }).finally(() => { console.log('一邊打工,一邊自學'); });
async 與 await
1、async 函式本質是 generator 的語法糖
2、async 函式返回一個 promise 物件
3、 async 函式內部 return 返回的值,會成為 then 方法回撥函式的引數
4、async函式返回的Promise物件,必須等到內部所有await命令的Promise物件執行完,才會發生狀態改變
5、正常情況下,await命令後面是一個Promise物件。如果不是,會被轉成一個立即resolve的Promise物件
6、 只要一個await語句後面的Promise變為reject,那麼整個async函式都會中斷執行
7、如果有多個await命令,可以統一放在try...catch結構中
8、 如果await後面的非同步操作出錯,那麼等同於async函式返回的Promise物件被reject
9、await命令後面的Promise物件,執行結果可能是rejected,所以最好把await命令放在try...catch程式碼塊中
10、多個await命令後面的非同步操作,如果不存在繼發關係,最好讓它們同時觸發
11、await命令只能用在async函式之中,如果用在普通函式,就會報錯
async function main() {
try {
var val1 = await firstStep();
var val2 = await secondStep(val1);
var val3 = await thirdStep(val1, val2);
console.log('Final: ', val3);
}
catch (err) {
console.error(err);
}
}
本作品採用《CC 協議》,轉載必須註明作者和本文連結