[英]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.