【发布时间】:2018-03-05 02:58:02
【问题描述】:
我有一个包含近 200 万个 Facebook idSender 的数组,我想对其进行迭代,为每个人调用一个 Facebook API。 现在,由于异步性,如果我启动一个简单的 for 循环,Facebook 会在 4-5 分钟后返回给我一个速率限制超出错误。 经过一些尝试,我发现避免速率限制的理想延迟是 20 毫秒。
所以我尝试了这个解决方案:我将函数包装在 Promise 中,并使用 setTimeout 设置延迟。
async function asyncLoop(values) {
var prm = await new Promise(function(resolve, reject) {
setTimeout(function() {
for (var i=0; i<values.length; i++) {
check(values[i].idSender, values[i].iscrizione, values[i].id_sito)
if(checked == values.length) {
resolve()
}
}
},20);
});
return prm;
}
asyncLoop(idSenderArray)
但是这个解决方案不起作用,而且我也知道使用 setTimeout 函数来操纵 Javascript 中的异步性几乎从来都不是一个好主意,事实上我什至不能说它到底发生了什么。
对我的功能可能进行的修改有什么建议吗?关于可以工作的全新实现的任何想法? 谢谢
【问题讨论】:
-
在这里尝试 async.eachLimit 而不是 promises?通过限制并发调用而不是每次调用花费的时间,您可以实现相同的目标。 caolan.github.io/async/docs.html#eachLimit
-
每 2M 项延迟 20 毫秒为您提供 11 小时 7 分钟的运行时间。你多久做一次......?
标签: javascript node.js asynchronous promise