簡體   English   中英

Node.js - 使用每秒5個請求的API限制

[英]Node.js - Working with an API limit of 5 requests per second

我有一個“腳本”,可以對特定的API執行數千個請求。 這個API每秒只允許5個請求(可能它的測量方式與我不同)。 為了發出請求,我正在使用request-promise框架,並且我已經取代了正常的request-promise函數:

const request_promise  = require('request-promise')

function waitRetryPromise() {
  var count = 0 // keeps count of requests
  function rp(options) {
    const timedCall = (resolve) => setTimeout( ()=>resolve(rp(options)),1000) // recursive call
    count += 1
    if (count % 3 == 0) { // recalls after a second on every third request
      return new Promise(timedCall)
    } else {
      return request_promise(options)
    }
  }
  return rp
}

const rp = waitRetryPromise()

一旦大約300個請求(給予或接受)短時間內被觸發,這些請求就會開始相互干擾。 有沒有人有更好的解決方案? 我認為對這個函數的遞歸調用會有所幫助,而且確實如此,但它沒有解決問題。 也許有一種模式可以對請求進行排隊,並且一次只能執行一些操作? 或許圖書館?

謝謝!

好的,而不是遞歸調用rp等,只需確保在請求之間延遲適當的數量......每秒5次,即200ms

function waitRetryPromise() {
    let promise = Promise.resolve();
    return function rp(options) {
        return promise = promise
        .then(() => new Promise(resolve => setTimeout(resolve, 200)))
        .then(() => request_promise(options));
    }
}
const rp = waitRetryPromise();

只要他們的工作要完成,我的代碼就會運行TimedQueue 所有工作完成后, process()方法結算:

 class Queue { constructor() { this.queue = []; } enqueue(obj) { return this.queue.push(obj); } dequeue() { return this.queue.shift(); } hasWork() { return (this.queue.length > 0); } } function t_o(delay) { return new Promise(function (resolve, reject) { setTimeout(function () { resolve(); }, delay); }); } class TimedQueue extends Queue { constructor(delay) { super(); this.delay = delay; } dequeue() { return t_o(this.delay).then(() => { return super.dequeue(); }); } process(cb) { return this.dequeue().then(data => { cb(data); if (this.hasWork()) return this.process(cb); }); } } var q = new TimedQueue(500); for (var request = 0; request < 10; ++request) q.enqueue(request); q.process(console.log).then(function () { console.log('done'); }); 

我不確定,但也許你從下面得到一些想法

 function placeAnOrder(orderNumber) { console.log("customer order:", orderNumber) cookAndDeliverFood(function () { console.log("food delivered order:", orderNumber); }); } // 1 sec need to cook function cookAndDeliverFood(callback){ setTimeout(callback, 1000); } //users web request placeAnOrder(1); placeAnOrder(2); placeAnOrder(3); 
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM