异步等待一个函数

我正在尝试发送短信给某个功能。 但问题是:该功能需要大约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

  • 你应该在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。

    没有必要详细解释它,因为我们甚至不知道它是否会回复承诺或根本不需要回复 - 这都是猜测。 您可以看到其他答案,解释如果您感兴趣,承诺和回调如何工作:

  • 有关如何使用回调和承诺的详细说明
  • 有关如何在复杂的请求处理程序中使用promise的说明
  • 关于AJAX请求的例子,解释了什么是承诺
  • 解释回调,承诺以及如何访问异步返回的数据
  • 综上所述:

    如果在循环中调用的函数既不返回承诺也不回调 - 那么您只能添加超时来延迟它们。

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

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

    链接地址: http://www.djcxy.com/p/55385.html

    上一篇: Async wait for a function

    下一篇: Resolving a setTimeout inside API endpoint