异步等待一个函数
我正在尝试发送短信给某个功能。 但问题是:该功能需要大约10-15秒才能完成(因为我们用PhantomJS完成了一堆东西)。
_.each(users, function(userData){ // This does not work since i need to wait for 15 seconds
smsFree.sendSMSFree(userData, productUrl);
});
我甚至尝试过使用setTimeout,但这并没有很好的工作。
我在NodeJS上。 我如何利用异步或其他库来解决我的问题?
我想等待15秒,然后循环到第二个对象。 不知道这是如何实现的。 (Async.serial?)
你应该在Q中使用promise模式。你的函数应该返回一个promise,事情会变得更简单:
Q.all(users.map(user => smsFree.sendSMSFree(userData, productUrl)))
.then(() => {
// Do stuff once every SMS has been successfully sent!
});
或标准Promise
:
Promise.all(users.map(user => smsFree.sendSMSFree(userData, productUrl)))
.then(() => {
// Do stuff once every SMS has been successfully sent!
});
如果你的函数没有使用承诺模式,你可以将其包装以使用整个模式,否则你会被卡在实现异步继续的情况下。
一个可能适合你的快速和肮脏的解决方案:
var n = 0;
_.each(users, function (userData) {
setTimeout(function () {
smsFree.sendSMSFree(userData, productUrl);
}, 15000 * n++;
});
它在它们之间以15000毫秒(15秒)的间隔运行每次迭代的功能。 除非 sendSMSFree
需要回调或返回承诺, 否则这是唯一可以实现的方法。
如果它返回一个承诺(它可能,你没有解释你的问题是如何工作的),并且你想同时运行它们,但是要等到所有这些都完成了 - 请参阅MatíasFidemraizer的答案。
如果你想连续运行它们,也就是在前一个完成后立即运行一个新的,那么它会更复杂。 如果你想在开始下一个之前增加15秒的延迟时间,它将会更加复杂。
如果该函数需要回调,则可以使用async.series。
没有必要详细解释它,因为我们甚至不知道它是否会回复承诺或根本不需要回复 - 这都是猜测。 您可以看到其他答案,解释如果您感兴趣,承诺和回调如何工作:
综上所述:
如果在循环中调用的函数既不返回承诺也不回调 - 那么您只能添加超时来延迟它们。
如果它返回一个承诺 - 您可以使用Q或Bluebird来控制流量。
如果需要回调 - 您可以使用异步来控制流量。
链接地址: http://www.djcxy.com/p/55385.html