国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

巧用 `Promise.all` 實(shí)現(xiàn)函數(shù):有一個(gè) Promise 被 resolve 整個(gè)函數(shù)就被

genefy / 3274人閱讀

摘要:調(diào)用分布式服務(wù)接口時(shí)經(jīng)常會(huì)遇到這樣的問(wèn)題接口方提供多個(gè)供用戶(hù)調(diào)用,只要有一個(gè)返回成功就算成功。但是請(qǐng)注意不是等到有一個(gè)被時(shí)返回,而是只要有一個(gè)被時(shí)就會(huì)返回,不論這個(gè)是還是。

調(diào)用分布式服務(wù)接口時(shí)經(jīng)常會(huì)遇到這樣的問(wèn)題:接口方提供多個(gè) IP 供用戶(hù)調(diào)用,只要有一個(gè)返回成功就算成功。

對(duì)于這樣的問(wèn)題,一個(gè)比較簡(jiǎn)單的方案是依次調(diào)用各個(gè)接口,如果前一個(gè)接口未成功返回再調(diào)用第二個(gè)接口。這樣做的好處是對(duì)于服務(wù)器資源消耗比較小,但對(duì)于用戶(hù)來(lái)說(shuō)效率非常低下。設(shè)想調(diào)用第一個(gè)接口經(jīng)過(guò) 20 秒超時(shí)出錯(cuò)才調(diào)用第二個(gè)接口,如果第二個(gè)接口又是 20 秒超時(shí),用戶(hù)就已經(jīng)等待了 40 秒。用戶(hù)的等待時(shí)間按線性增長(zhǎng),這樣的結(jié)果時(shí)不可接受的。

好的解決方案是同時(shí)并發(fā)調(diào)用所有接口,有些同學(xué)可能會(huì)想到 Promise.race。但是請(qǐng)注意:Promise.race 不是等到有一個(gè) Promise 被 resolve 時(shí)返回,而是只要有一個(gè) Promise 被 fulfill 時(shí)就會(huì)返回,不論這個(gè) Promise 是 resolve 還是 reject。

我就遇到過(guò)類(lèi)似問(wèn)題,當(dāng)然也被 Promise.race 坑害了一回。上谷歌搜到了老外這篇博文:Promise me you won’t use Promise.race。博文中詳細(xì)探討了這個(gè)問(wèn)題,并用 Promise.race 實(shí)現(xiàn)了一個(gè)解決方案:

Promise.properRace = function properRace(promises) {
  if (promises.length < 1) {
    return Promise.reject("Can"t start a race without promises!");
  }

  // There is no way to know which promise is rejected.
  // So we map it to a new promise to return the index when it fails
  const indexPromises = promises.map((p, index) => p.catch(e => {
    console.debug("Promise rejected in `properRace`: " + e);
    return Promise.reject(index);
  }));

  return Promise.race(indexPromises).catch(index => {
    // The promise has rejected, remove it from the list of promises and just continue the race.
    promises.splice(index, 1)[0].catch(() => { /* eat this */ });
    return promises.length ? properRace(promises) : Promise.reject("All promises rejected");
  });
};

雖然略顯復(fù)雜,但方法確實(shí)很巧妙,我初期就使用了這種方法。最近回過(guò)頭來(lái)突然想到:properRace 的需求是只要有一個(gè)被 resolve 返回的 Promise 就被 resolve;JavaScript 雖然沒(méi)有提供這樣的函數(shù),但是提供了另外一個(gè)很相似的函數(shù):只要有一個(gè)被 reject 返回的 Promise 就被 reject。

這個(gè)函數(shù)我們很常用,就是:Promise.all

想到這一層,那么用它來(lái)實(shí)現(xiàn) properRace 就很簡(jiǎn)單了:把傳入的 Promise 數(shù)組狀態(tài)正反對(duì)調(diào)就好了。結(jié)果如下:

Promise.properRace = function properRace(promises) {
  const resolve = Promise.resolve.bind(Promise);
  const reject = Promise.reject.bind(Promise);
  return Promise.all(promises.map(x => x.then(reject, resolve)))
    .then(reject, resolve);
}

2019年7月更新

此方法已經(jīng)被標(biāo)準(zhǔn)化為 Promise.any

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

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

相關(guān)文章

  • JavaScript Promise API

    摘要:我們使用關(guān)鍵字和提供的和回調(diào)函數(shù)來(lái)創(chuàng)建新的根據(jù)異步任務(wù)的返回結(jié)果,開(kāi)發(fā)者可以在回調(diào)函數(shù)體的內(nèi)部手動(dòng)調(diào)用或者。第一個(gè)方法的回調(diào)函數(shù)接收方法里的值當(dāng)被時(shí),會(huì)調(diào)用回調(diào)方法。如果被,而方法在之后,那回調(diào)函數(shù)永遠(yuǎn)不會(huì)被執(zhí)行。 盡管同步代碼易于追蹤和調(diào)試,但異步代碼普遍在性能和靈活性上更具優(yōu)勢(shì)。Why hold up the show when you can trigger numerous r...

    peixn 評(píng)論0 收藏0
  • 從0到1實(shí)現(xiàn)Promise

    摘要:通過(guò)或者拿到方法回調(diào)函數(shù)的返回值,然后調(diào)用,將新增的的和傳入到中。打印結(jié)果實(shí)現(xiàn)方法接收一個(gè)包含多個(gè)的數(shù)組,當(dāng)有一個(gè)為狀態(tài)時(shí),整個(gè)大的為,并執(zhí)行回調(diào)函數(shù)。 前言 Promise大家一定都不陌生了,JavaScript異步流程從最初的Callback,到Promise,到Generator,再到目前使用最多的Async/Await(如果對(duì)于這些不熟悉的可以參考我另一篇文章《JavaScri...

    EddieChan 評(píng)論0 收藏0
  • 馬蹄疾 | 詳解 JavaScript 異步機(jī)制及發(fā)展歷程(萬(wàn)字長(zhǎng)文)

    摘要:本文從入手,系統(tǒng)的回顧的異步機(jī)制及發(fā)展歷程。需要提醒的是,文本沒(méi)有討論的異步機(jī)制。這就是之前提到的事件觸發(fā)線程。其實(shí)無(wú)論是請(qǐng)求還是定時(shí)器還是事件,我們都可以統(tǒng)稱(chēng)它們?yōu)槭录?。第二階段,引擎線程專(zhuān)注于處理事件。將外元素的事件回調(diào)放入調(diào)用棧。 functionshowImg(url){ varframeid=frameimg+Math.random(); window.img=window....

    shaonbean 評(píng)論0 收藏0
  • 淺談 Promise

    摘要:解決異步編程有兩種主要方式事件模型和回調(diào)函數(shù)。將異步操作以同步操作的流程表達(dá)出來(lái),避免了層層嵌套回調(diào)函數(shù)。方法是的別名,相當(dāng)于函數(shù)的第一個(gè)參數(shù)傳入,第二個(gè)參數(shù)傳入發(fā)生錯(cuò)誤時(shí)的回調(diào)函數(shù)。 JavaScript 解決異步編程有兩種主要方式:事件模型和回調(diào)函數(shù)。但是隨著業(yè)務(wù)越來(lái)越復(fù)雜,這兩種方式已經(jīng)不能滿(mǎn)足開(kāi)發(fā)者的需求了,Promise 可以解決這方面的問(wèn)題。為了更好的理解 Promise ...

    李濤 評(píng)論0 收藏0
  • 簡(jiǎn)單學(xué)習(xí) Promise 對(duì)象

    摘要:方法是的別名,用于指定發(fā)生錯(cuò)誤時(shí)的回調(diào)函數(shù)。由于字符串不屬于異步操作判斷方法是字符串對(duì)象不具有方法,返回實(shí)例的狀態(tài)從一生成就是,所以回調(diào)函數(shù)會(huì)立即執(zhí)行。出錯(cuò)了等同于出錯(cuò)了出錯(cuò)了上面的代碼生成一個(gè)對(duì)象的實(shí)例,狀態(tài)為,回調(diào)函數(shù)會(huì)立即執(zhí)行。 引言 Promise 是異步編程的一種解決方案,比傳統(tǒng)的解決方案——回調(diào)和事件——更合理且強(qiáng)大。最近的項(xiàng)目要用到這個(gè),就參照阮一峰老師的《ES6標(biāo)準(zhǔn)入門(mén)...

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

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

0條評(píng)論

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