為Promise新增一個方法
Promise在JS中可以說有著舉足輕重的地位,很早之前就看了很多Promise的文章和書籍,記得在一篇文章中看到過Promise的list方法(作用下邊有詳細介紹)還做了筆記,但是,在使用的時候卻發現現在的JS標準(ES6)不支援list方法,所以,就自己寫一個吧!哈哈哈哈哈
Promise.list():
作用:將多個Promise物件包裝成一個新的Promise物件,並行執行多個Promise物件,所有Promise物件結束觸發then事件。主要功能:若有Promise物件出錯(list方法的重點),則包裝為
{ error: "error msg" } // 錯誤資訊
正確則返回結果。
示例:
var p = Promise.list([p1,p2,p3]);
p.then(function(values) {
// values為[{p1的結果},{p2的結果},{p3的結果}]
})
接受引數:一個陣列,陣列每一項為Promise物件,如p1、p2、p3。
返回結果:一個陣列,順序排列每一項的結果。
實現:
if (!Promise.list) {
Promise.list = function (jobArr) {
let jobsResult = [];
jobArr.forEach(function (job) {
// 執行陣列內的Promise物件,出現錯誤包裝為{"error": reason}
jobsResult.push(job.then(function (value) {
return value;
}).catch(function (reason) {
return {"error": reason};
}));
})
// 用Promise.all包裝為一個新的Promise物件
return Promise.all(jobsResult);
}
}
// 精簡版
Promise.list = list => Promise.all( list.map( item => item.then(val => ({val})).catch(err => ({err}))));
使用示例:
// 新增Promise.list方法
if (!Promise.list) {
Promise.list = function (jobArr) {
let jobsResult = [];
jobArr.forEach(function (job) {
jobsResult.push(job.then(function (value) {
return value;
}).catch(function (reason) {
return {"error": reason};
}));
})
return Promise.all(jobsResult);
}
}
// 建立一個陣列,每一項為Promise物件
var pArr = [1, 2, 3, 4].map(function (value) {
if (value == 3) { // 第三個設定為會出錯的Promise物件
return createPromise(0);
} else {
return createPromise(1);
}
})
// 建立Promise物件的方法,returnStatus為1返回正確的Promise物件,其他則返回錯誤的Promise物件
function createPromise(returnStatus) {
return new Promise(function (reslove, reject) {
if (returnStatus == 1) {
reslove({data: "success"});
} else {
reject("failed");
}
});
}
// 呼叫Promise.list()方法
Promise.list(pArr).then(function (value) {
console.log("value:", value); // 第三個會返回錯誤資訊:[ { data: 'success' },{ data: 'success' },{ error: 'failed' },{ data: 'success' } ]
}).catch(function (reason) {
console.log("error:", reason);
})
總結:歡迎指教。哈哈哈哈哈
相關文章
- 實現一個promisePromise
- 手寫一個PromisePromise
- 一個Promise面試題Promise面試題
- promise原理—一步一步實現一個promisePromise
- 你能手寫一個Promise嗎?Yes I promise。Promise
- Promise進階——如何實現一個Promise庫Promise
- Promise和Promise的方法Promise
- 自己鼓搗一個PromisePromise
- 實現一個玩具 Promise ~Promise
- Promise then() 方法Promise
- 實現一個Promise(基於Promise/A+規範)Promise
- Promise 原始碼:實現一個簡單的 PromisePromise原始碼
- Promise原理講解 && 實現一個Promise物件 (遵循Promise/A+規範)Promise物件
- 在 JavaScript 中,我們能為原始型別新增一個屬性或方法嗎?JavaScript型別
- 一步一步實現一個Promise A+規範的 PromisePromise
- 實現一個完美符合Promise/A+規範的PromisePromise
- 從手寫一個符合Promise/A+規範Promise來深入學習PromisePromise
- 從頭手寫一個PromisePromise
- 用promise封裝一個ajaxPromise封裝
- 手寫一個自己的PromisePromise
- 實現一個完整的promisePromise
- 手寫一個自定義PromisePromise
- Promise catch() 方法Promise
- 為你的論壇系統新增一個『提及』功能
- 為主頁新增一個漂亮的按鈕(下)(轉)
- 為主頁新增一個漂亮的按鈕(上)(轉)
- 我也來扔一個Promise吧……Promise
- 老生常談-實現一個PromisePromise
- 一步一步實現一個PromisePromise
- Promise.reject() 方法Promise
- Promise.race() 方法Promise
- 為什麼ES6新增了Promise物件來處理非同步呼叫Promise物件非同步
- ubuntu新增一個源Ubuntu
- 新增speak成員方法,輸出我是一個好人
- 一、promisePromise
- 手動實現一個promise(原始碼)Promise原始碼
- 手寫一個Promise,附原始碼分析Promise原始碼
- 前端雜談: 如何實現一個 Promise?前端Promise