成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

JavaScript Promise.all 和 Promise.race 方法介紹和簡(jiǎn)要實(shí)現(xiàn)

lewif / 2343人閱讀

摘要:方法接受一個(gè)包含對(duì)象或普通值的數(shù)組或其它可迭代對(duì)象作為參數(shù),并返回一個(gè)。需要一個(gè)數(shù)組,按順序記錄返回結(jié)果。如果使用類似的方式遍歷,為避免閉包只能傳入變量引用的問(wèn)題,需要嵌套一層自執(zhí)行函數(shù)。如果其中之一的對(duì)象,也會(huì)立即。

Promise.all() 方法接受一個(gè)包含 Promise 對(duì)象或普通值的數(shù)組(或其它可迭代對(duì)象)作為參數(shù),并返回一個(gè) Promise。當(dāng)所有 Promise 對(duì)象都 resolve 后,將所有 resolve 值以數(shù)組形式作為 Promise.all() resolve 的結(jié)果。如果其中之一的 Promise 被 reject,立即以第一個(gè) reject 的值作為 Promise.all() reject 結(jié)果。

在實(shí)際應(yīng)用中,如果需要從幾個(gè)接口獲取數(shù)據(jù),并且要在所有數(shù)據(jù)到達(dá)后才執(zhí)行某些操作,就可以使用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]

以下是代碼實(shí)現(xiàn),需要一個(gè)計(jì)數(shù)器,來(lái)確認(rèn)所有 promise 對(duì)象都已經(jīng) resolved,之后返回結(jié)果。需要一個(gè)數(shù)組,按順序記錄返回結(jié)果。如果使用類似 for (var i = 0; i < iterable[i]; i++) 的方式遍歷,為避免閉包只能傳入變量引用的問(wèn)題,需要嵌套一層自執(zhí)行函數(shù)。這里使用 for ... in 循環(huán),使函數(shù)可以支持除數(shù)組外的其它可迭代對(duì)象,如數(shù)據(jù)結(jié)構(gòu) 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() 方法接受一個(gè)包含 Promise 對(duì)象或普通值的數(shù)組(或其它可迭代對(duì)象)作為參數(shù),并返回一個(gè) Promise。一旦其中之一的 Promise 對(duì)象 resolve 以后,立即把 resolve 的值作為 Promise.race() resolve 的結(jié)果。如果其中之一的對(duì)象 reject,Promise.race也會(huì)立即 reject。

在實(shí)際應(yīng)用中,如果可以從幾個(gè)接口獲取相同的數(shù)據(jù),哪個(gè)接口數(shù)據(jù)先到就先用哪個(gè),就可以使用Promise.race(),所需時(shí)間等于其中最快的那個(gè)接口。下面是代碼:

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

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://hztianpu.com/yun/102540.html

相關(guān)文章

  • javascript異步之Promise.all()、Promise.race()、Promise.

    摘要:的執(zhí)行與狀態(tài)無(wú)關(guān)當(dāng)?shù)玫綘顟B(tài)不論成功或失敗后就會(huì)執(zhí)行,原文鏈接參考鏈接對(duì)象 同期異步系列文章推薦談一談javascript異步j(luò)avascript異步中的回調(diào)javascript異步與promisejavascript異步之Promise.resolve()、Promise.reject()javascript異步之Promise then和catchjavascript異步之a(chǎn)sync...

    clasnake 評(píng)論0 收藏0
  • 異步解決方案----Promise與Await

    摘要:前言異步編程模式在前端開發(fā)過(guò)程中,顯得越來(lái)越重要。隨著新標(biāo)準(zhǔn)的到來(lái),處理異步數(shù)據(jù)流又有了新的方案。接下來(lái)我們介紹這兩種處理異步編程的方案。仍在繼續(xù)執(zhí)行,但執(zhí)行結(jié)果將被丟棄。使得異步代碼看起來(lái)像同步代碼,再也沒(méi)有回調(diào)函數(shù)。 前言 異步編程模式在前端開發(fā)過(guò)程中,顯得越來(lái)越重要。從最開始的XHR到封裝后的Ajax都在試圖解決異步編程過(guò)程中的問(wèn)題。隨著ES6新標(biāo)準(zhǔn)的到來(lái),處理異步數(shù)據(jù)流又有了新...

    Blackjun 評(píng)論0 收藏0
  • 異步解決方案----Promise與Await

    摘要:前言異步編程模式在前端開發(fā)過(guò)程中,顯得越來(lái)越重要。隨著新標(biāo)準(zhǔn)的到來(lái),處理異步數(shù)據(jù)流又有了新的方案。接下來(lái)我們介紹這兩種處理異步編程的方案。仍在繼續(xù)執(zhí)行,但執(zhí)行結(jié)果將被丟棄。使得異步代碼看起來(lái)像同步代碼,再也沒(méi)有回調(diào)函數(shù)。 前言 異步編程模式在前端開發(fā)過(guò)程中,顯得越來(lái)越重要。從最開始的XHR到封裝后的Ajax都在試圖解決異步編程過(guò)程中的問(wèn)題。隨著ES6新標(biāo)準(zhǔn)的到來(lái),處理異步數(shù)據(jù)流又有了新...

    Neilyo 評(píng)論0 收藏0
  • 異步解決方案----Promise與Await

    摘要:前言異步編程模式在前端開發(fā)過(guò)程中,顯得越來(lái)越重要。隨著新標(biāo)準(zhǔn)的到來(lái),處理異步數(shù)據(jù)流又有了新的方案。接下來(lái)我們介紹這兩種處理異步編程的方案。仍在繼續(xù)執(zhí)行,但執(zhí)行結(jié)果將被丟棄。使得異步代碼看起來(lái)像同步代碼,再也沒(méi)有回調(diào)函數(shù)。 前言 異步編程模式在前端開發(fā)過(guò)程中,顯得越來(lái)越重要。從最開始的XHR到封裝后的Ajax都在試圖解決異步編程過(guò)程中的問(wèn)題。隨著ES6新標(biāo)準(zhǔn)的到來(lái),處理異步數(shù)據(jù)流又有了新...

    entner 評(píng)論0 收藏0
  • 【譯】理解回調(diào)Promise

    摘要:理解回調(diào)和原文自工程師博客,傳送門這兩個(gè)概念是編程語(yǔ)言的基本內(nèi)容?;卣{(diào)地獄就是濫用回調(diào)。通常,在回調(diào)中,錯(cuò)誤作為第一個(gè)參數(shù)傳遞。這個(gè)具有這兩個(gè)函數(shù)作為參數(shù)的回調(diào)稱為執(zhí)行程序。到目前為止,我希望我已經(jīng)讓自己了解了回調(diào)和。 理解回調(diào)和Promise 原文自工程師Fernando Hernandez博客,傳送門 這兩個(gè)概念是Javascript編程語(yǔ)言的基本內(nèi)容。因?yàn)檫@種語(yǔ)言是在異步編程的...

    liuyix 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

lewif

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<