ES6 學習筆記三

zs4336發表於2019-11-04

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 協議》,轉載必須註明作者和本文連結

趁還沒掉光,趕緊給每根頭髮起個名字吧~

相關文章