摘要:方法接受一個包含對象或普通值的數組或其它可迭代對象作為參數,并返回一個。需要一個數組,按順序記錄返回結果。如果使用類似的方式遍歷,為避免閉包只能傳入變量引用的問題,需要嵌套一層自執行函數。如果其中之一的對象,也會立即。
Promise.all() 方法接受一個包含 Promise 對象或普通值的數組(或其它可迭代對象)作為參數,并返回一個 Promise。當所有 Promise 對象都 resolve 后,將所有 resolve 值以數組形式作為 Promise.all() resolve 的結果。如果其中之一的 Promise 被 reject,立即以第一個 reject 的值作為 Promise.all() reject 結果。
在實際應用中,如果需要從幾個接口獲取數據,并且要在所有數據到達后才執行某些操作,就可以使用Promise.all()。
const p1 = new Promise(function (resolve) { setTimeout(resolve, 200, 1) }) const p2 = Promise.resolve(2) const p3 = 3 Promise.all([p1, p2, p3]).then(function (res) { console.log(res) }) // [1,2,3]
以下是代碼實現,需要一個計數器,來確認所有 promise 對象都已經 resolved,之后返回結果。需要一個數組,按順序記錄返回結果。如果使用類似 for (var i = 0; i < iterable[i]; i++) 的方式遍歷,為避免閉包只能傳入變量引用的問題,需要嵌套一層自執行函數。這里使用 for ... in 循環,使函數可以支持除數組外的其它可迭代對象,如數據結構 Set。
const all = function (iterable) { return new Promise(function (resolve, reject) { let count = 0, ans = new Array(count) for (const i in iterable) { const v = iterable[i] if (typeof v === "object" && typeof v.then === "function") { v.then(function (res) { ans[i] = res if (--count === 0) resolve(ans) }, reject) count++ } else { ans[i] = v } } }) } const p1 = new Promise(function (resolve) { setTimeout(resolve, 200, 1) }) const p2 = Promise.resolve(2) const p3 = 3 all([p1, p2, p3]).then(function (res) { console.log(res) }) // [1,2,3]
同 Promise.all(),Promise.race() 方法接受一個包含 Promise 對象或普通值的數組(或其它可迭代對象)作為參數,并返回一個 Promise。一旦其中之一的 Promise 對象 resolve 以后,立即把 resolve 的值作為 Promise.race() resolve 的結果。如果其中之一的對象 reject,Promise.race也會立即 reject。
在實際應用中,如果可以從幾個接口獲取相同的數據,哪個接口數據先到就先用哪個,就可以使用Promise.race(),所需時間等于其中最快的那個接口。下面是代碼:
const race = function (iterable) { return new Promise(function (resolve, reject) { for (const i in iterable) { const v = iterable[i] if (typeof v === "object" && typeof v.then === "function") { v.then(resolve, reject) } else { resolve(v) } } }) } const p1 = new Promise(function (resolve) { setTimeout(resolve, 200, 1) }) const p2 = new Promise(function (resolve) { setTimeout(resolve, 100, 2) }) race([p1, p2]).then(function (res) { console.log(res) }) // 2
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/102540.html
摘要:的執行與狀態無關當得到狀態不論成功或失敗后就會執行,原文鏈接參考鏈接對象 同期異步系列文章推薦談一談javascript異步javascript異步中的回調javascript異步與promisejavascript異步之Promise.resolve()、Promise.reject()javascript異步之Promise then和catchjavascript異步之async...
摘要:前言異步編程模式在前端開發過程中,顯得越來越重要。隨著新標準的到來,處理異步數據流又有了新的方案。接下來我們介紹這兩種處理異步編程的方案。仍在繼續執行,但執行結果將被丟棄。使得異步代碼看起來像同步代碼,再也沒有回調函數。 前言 異步編程模式在前端開發過程中,顯得越來越重要。從最開始的XHR到封裝后的Ajax都在試圖解決異步編程過程中的問題。隨著ES6新標準的到來,處理異步數據流又有了新...
摘要:前言異步編程模式在前端開發過程中,顯得越來越重要。隨著新標準的到來,處理異步數據流又有了新的方案。接下來我們介紹這兩種處理異步編程的方案。仍在繼續執行,但執行結果將被丟棄。使得異步代碼看起來像同步代碼,再也沒有回調函數。 前言 異步編程模式在前端開發過程中,顯得越來越重要。從最開始的XHR到封裝后的Ajax都在試圖解決異步編程過程中的問題。隨著ES6新標準的到來,處理異步數據流又有了新...
摘要:前言異步編程模式在前端開發過程中,顯得越來越重要。隨著新標準的到來,處理異步數據流又有了新的方案。接下來我們介紹這兩種處理異步編程的方案。仍在繼續執行,但執行結果將被丟棄。使得異步代碼看起來像同步代碼,再也沒有回調函數。 前言 異步編程模式在前端開發過程中,顯得越來越重要。從最開始的XHR到封裝后的Ajax都在試圖解決異步編程過程中的問題。隨著ES6新標準的到來,處理異步數據流又有了新...
摘要:理解回調和原文自工程師博客,傳送門這兩個概念是編程語言的基本內容。回調地獄就是濫用回調。通常,在回調中,錯誤作為第一個參數傳遞。這個具有這兩個函數作為參數的回調稱為執行程序。到目前為止,我希望我已經讓自己了解了回調和。 理解回調和Promise 原文自工程師Fernando Hernandez博客,傳送門 這兩個概念是Javascript編程語言的基本內容。因為這種語言是在異步編程的...
閱讀 1393·2021-11-22 15:11
閱讀 2838·2019-08-30 14:16
閱讀 2755·2019-08-29 15:21
閱讀 2914·2019-08-29 15:11
閱讀 2451·2019-08-29 13:19
閱讀 2985·2019-08-29 12:25
閱讀 417·2019-08-29 12:21
閱讀 2829·2019-08-29 11:03