【每日一題NO.53】手寫Promise.allSettled

人生苦短,總需要一點(diǎn)儀式感。比如學(xué)前端~
Promise.allSettled MDN
概念
Promise.allSettled()方法接收一組 Promise 實(shí)例作為參數(shù),返回一個(gè)新的 Promise 實(shí)例只有等到所有的這些參數(shù)實(shí)例都返回結(jié)果,不管是 fulfilled 還是 rejected,包裝實(shí)例才會(huì)結(jié)束 返回新的 Promise 實(shí)例,一旦結(jié)束,狀態(tài)總是 fulfilled,不會(huì)變成 rejected 新的 promise 實(shí)例給監(jiān)聽函數(shù)傳遞一個(gè)數(shù)組 results。該數(shù)組的每個(gè)成員都是一個(gè)對象,對應(yīng)傳入 Promise.allSettled的Promise實(shí)例。每個(gè)對象都有status屬性,對應(yīng)著fulfilled和rejected。fulfilled時(shí),對象有value屬性,rejected時(shí)有reason屬性,對應(yīng)兩種狀態(tài)的返回值
有時(shí)候我們不關(guān)心異步操作的結(jié)果,只會(huì)關(guān)心這些操作有沒有結(jié)束的時(shí)候,這時(shí)候比較適用Promise.allSettled()
使用
const?resolved?=?Promise.resolve(42);
const?rejected?=?Promise.reject(-1);
const?allSettledPromise?=?Promise.allSettled([resolved,?rejected]);
allSettledPromise.then(function?(results)?{
??console.log(results);
});
//?[
//????{?status:?'fulfilled',?value:?42?},
//????{?status:?'rejected',?reason:?-1?}
//?]
簡單實(shí)現(xiàn)
const?formatSettledResult?=?(success,?value)?=>
??success
??????{?status:?"fulfilled",?value?}
????:?{?status:?"rejected",?reason:?value?};
Promise.all_settled?=?function?(iterators)?{
??const?promises?=?Array.from(iterators);
??const?num?=?promises.length;
??const?resultList?=?new?Array(num);
??let?resultNum?=?0;
??return?new?Promise((resolve)?=>?{
????promises.forEach((promise,?index)?=>?{
??????Promise.resolve(promise)
????????.then((value)?=>?{
??????????resultList[index]?=?formatSettledResult(true,?value);
??????????if?(++resultNum?===?num)?{
????????????resolve(resultList);
??????????}
????????})
????????.catch((error)?=>?{
??????????resultList[index]?=?formatSettledResult(false,?error);
??????????if?(++resultNum?===?num)?{
????????????resolve(resultList);
??????????}
????????});
????});
??});
};
//?測試
const?resolved?=?Promise.resolve(42);
const?rejected?=?Promise.reject(-1);
Promise.all_settled([resolved,?rejected]).then((results)?=>?{
??console.log(results);
});
所有《每日一題》的 知識(shí)大綱索引腦圖 整理在此:https://www.yuque.com/dfe_evernote/interview/everyday
你也可以點(diǎn)擊文末的 “閱讀原文” 快速跳轉(zhuǎn)

評論
圖片
表情
