【发布时间】:2017-12-31 00:21:32
【问题描述】:
我的 Node 应用程序将发票数据发送到 API,我希望我的应用程序在每次发票发布后按顺序发送数据/等待一段时间,因为如果一秒钟内有超过 20 个请求,API 服务器会阻止请求。
我认为一种方法是在每次迭代后暂停 for 循环,但我不确定如何实现。
下面是我目前将“发票生成”-promises 推送到 for 循环中的数组,然后使用 Promise.all 解决它们的代码。
感谢所有 cmets。
// First, get access token from the service API
serviceAPI.auth().then((token) => {
// Array for the invoice promises
let invoicePromises = [];
// Push promises to the array
for (let i = 0; i < rowAmount; i++) {
invoicePromises.push(serviceAPI.generate(i, sheetData[i], token));
}
return Promise.all(invoicePromises);
}).then((results) => {
console.log(results);
return utils.sortReport(results); // Return sorted results
}).catch((e) => { console.error(e)});
【问题讨论】:
-
这是一种实际计量您对任何特定请求数/秒的请求的方法:Choose proper async method for batch processing with rate limiting
-
请记住,高效可靠地管理每秒请求数并不像插入延迟那么简单。一种可靠且有效地将您保持在每秒请求数以下的算法需要对请求进行计数和计时,并使用计时器来安排何时可以发送下一个请求。
-
@jfriend00:感谢这些明智的话。我现在会努力学习的。
-
@jfriend00:是否可以在 Node 中重新创建您的函数,或者我是否真的需要使用异步库或类似的东西进行同步流?您的示例有助于理解这个想法,但我正在努力使其在 Node 中工作。
-
我的
rateLimitMap()函数在 node.js 中运行良好。要使用它,您只需要有一个要迭代的数组,有一个接受数组元素作为参数并返回承诺的函数,然后复制rateLimitMap()函数。您可以只删除update()函数以不执行任何操作或从rateLimitMap()函数中删除对它的调用,因为这些调用只是为了显示演示中的进度。其他一切都只是可以在任何地方运行的通用 Javascript。
标签: javascript node.js promise delayed-execution