2016-11-22 286 views
0

我正在尝试发送函数的短信。但问题是:该功能需要大约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?)

  • [R
+0

如何判断函数何时结束?它会返回一个承诺吗?要求回拨? –

+0

@MadaraUchiha让我们说我的其他功能确实给回电话。现在你能告诉我如何修改这个以等待我循环其他对象之前? – TechnoCorner

+0

理想情况下,您需要了解承诺..之后,您可以使用一些很好的功能,使用和声开关隐藏在节点V7中。 'async'&'await'。 – Keith

回答

4

您应该使用promise patternwith Q。你的函数应返回一个承诺和事情就好办了:

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! 
     }); 

如果功能不使用承诺模式你可以把它包装使用整个模式,否则你会被卡在实现异步延续的方面...

2

一个快速和肮脏的解决方案,米飞行为你工作:

var n = 0; 
_.each(users, function (userData) { 
    setTimeout(function() { 
    smsFree.sendSMSFree(userData, productUrl); 
    }, 15000 * n++; 
}); 

它运行与15000毫秒(15秒),它们之间的间隔每次迭代的功能。这是你能做到这一点,除非sendSMSFree要么需要一个回调或返回一个承诺的唯一途径。

如果它返回一个承诺(它可能,你没有解释你的问题是如何工作的),并且你想同时运行它们,但要等到所有这些都完成了 - 看到答案通过MatíasFidemraizer。

如果您想要串联运行它们,即在前一个完成后立即运行一个新的,那么它会更加复杂。如果你想在开始下一个之前增加15秒的延迟时间,它将会更加复杂。

如果函数需要一个回调,那么你可以使用async.series

有中详细解释它是没有意义的,因为我们甚至不知道它是否会返回一个承诺或采取回调在所有 - 这都是猜测。你可以看到,解释如果你有兴趣的承诺和回调是如何工作的其他答案:

总结:

如果你在循环中调用的函数都不是返回一个承诺也不需要回调 - 那么你只能添加超时来延迟它们。

如果它返回一个承诺 - 您可以使用Q或蓝鸟来控制流量。

如果需要回调 - 您可以使用异步来控制流量。