亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

向一次只能處理20個請求的API發出多個請求

向一次只能處理20個請求的API發出多個請求

茅侃侃 2019-10-23 15:05:43
我有一個返回promise的方法,并且在內部該方法調用一個API,該API每分鐘只能有20個請求。問題是我有很多對象(大約300個),并且我想為每個對象調用API。目前,我有以下代碼:    const bigArray = [.....];    Promise.all(bigArray.map(apiFetch)).then((data) => {      ...    });但是它不處理時序約束。我希望我可以使用_.chunk和_.debounce之類的東西,lodash但是我無法解決這個問題。有人可以幫我嗎?
查看完整描述

2 回答

?
慕尼黑5688855

TA貢獻1848條經驗 獲得超2個贊

您可以每分鐘發送1個包含20個請求的塊,或者每3秒將其間隔1個請求(這可能是API所有者更喜歡的)。


function rateLimitedRequests(array, chunkSize) {

  var delay = 3000 * chunkSize;

  var remaining = array.length;

  var promises = [];

  var addPromises = function(newPromises) {

    Array.prototype.push.apply(promises, newPromises);

    if (remaining -= newPromises.length == 0) {

      Promise.all(promises).then((data) => {

        ... // do your thing

      });

    }

  };

  (function request() {

    addPromises(array.splice(0, chunkSize).map(apiFetch));

    if (array.length) {

      setTimeout(request, delay);

    }

  })();

}

要每3秒撥打1個電話:


rateLimitedRequests(bigArray, 1);

或每分鐘20個:


rateLimitedRequests(bigArray, 20);

如果您喜歡使用_.chunk和1:_.debounce _.throttle


function rateLimitedRequests(array, chunkSize) {

  var delay = 3000 * chunkSize;

  var remaining = array.length;

  var promises = [];

  var addPromises = function(newPromises) {

    Array.prototype.push.apply(promises, newPromises);

    if (remaining -= newPromises.length == 0) {

      Promise.all(promises).then((data) => {

        ... // do your thing

      });

    }

  };

  var chunks = _.chunk(array, chunkSize);  

  var throttledFn = _.throttle(function() {

    addPromises(chunks.pop().map(apiFetch));

  }, delay, {leading: true});

  for (var i = 0; i < chunks.length; i++) {

    throttledFn();

  }

}

1您可能想要,_.throttle因為它會在延遲后執行每個函數調用,而_.debounce將多個調用組合為一個調用??吹竭@個文章從鏈接的文檔


防抖動:把它看成是“分組多個事件之一”。試想一下,你回家,在電梯進入,門正在關閉......,突然你的鄰居出現在大廳,并試圖跳上電梯。要有禮貌!并打開大門,他說:你去抖動電梯離去??紤]到同樣的情況可以與第三人再次發生,等等...大概推遲起飛幾分鐘。


油門:將其視為閥門,它調節執行流程。我們能確定的時間函數可以在一定時間內被稱為最大數。所以在電梯比喻..你有足夠的禮貌,讓在持續10秒的人,但一旦延遲的推移,你必須去!


查看完整回答
反對 回復 2019-10-23
  • 2 回答
  • 0 關注
  • 594 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號