Promise
可以使用.then將原本不斷層疊的語法改為段落串接式
雖然關係仍然相同,在撰寫和閱讀上有大幅差異
code:javascript
function promiseFn(num, time = 500) {
return new Promise((resolve, reject) => {
setTimeout(() => {
num ? resolve(${num}, 成功) : reject("失敗");
}, time);
});
}
promiseFn(1)
.then((res) => {
console.log(res);
return promiseFn(2);
})
.then((res) => {
console.log(res);
});
resolve回傳成功時的值
也就是.then會取得resolve的值
reject回傳失敗時的值
.catch會取得reject的值
有四種狀態
擱置
初始狀態,操作未開始執行
實現
操作成功完成
拒絕
操作失敗
解決
操作已結束
同步操作
完成時resolve會觸發fulfilled
執行.then之後的行為
失敗時reject會觸發rejected
執行.catch之後的行為
或是.then的第二個參數
也是回傳promise
也可以直接呼叫resolve接受某個值或操作
例如必定會如預期的行為,或是來自不同Promise API的promise
或是將reject用於偵錯或保持一致性時,拒絕某個值或操作
Promise.resolve(foo()).then(bar()).then(lastStep);
另外還有
.finally
必定執行
.race
傳入一陣列
其中任何一個promise物件解決之後,就會往下執行
不論是resolve或reject
.all
傳入一陣列
其中所有promise物件解決之後,才會往下執行
適用於如讀取檔案或有連線需求時
.any
和.race近似,差在全部reject才會回傳AggregateError
.allSettled
code:javascript
const p1 = Promise.resolve(3);
const p2 = 1337;
const p3 = new Promise((resolve, reject) => {
setTimeout(() => resolve("foo"), 1000);
});
.then((value) => {
})
.catch((err) => {
console.log(err.message);
});
code:javascript
(async function() {
const forAll = arr.map(x => timerC(x));
const res = await Promise.all(forAll);
console.log('end all', res);
})();