繁体   English   中英

如何在下次通话前重复拨打电话并等待完成?

[英]How to repeatedly call a function and wait for completion before next call?

我正在使用node.js

我有一个函数,我需要在循环中调用几个参数。 必须使用循环迭代器作为参数调用该函数,并且循环在完成处理之前不得再次调用该函数。

像这样的东西(同步方法):(注意someFunc是一个异步函数)

var totCount = 1000;
for (var x = 0 ; x < totCount ; x++) {
    someFunc(x, parm2, parm3, parm4);
}

我理解在节点中, someFunc可以按任何顺序执行,但对于这种情况,它绝对必须执行x = 0然后1然后2等。

似乎异步库调用“async.whilst”会执行此操作,但我无法将示例转换为我的真实代码。

以下是“async.whilst”的示例:

var count = 0;

async.whilst(
    function () { return count < 5; },
    function (callback) {
        count++;
        setTimeout(callback, 1000);
    },
    function (err) {
        // 5 seconds have passed
    }
);

请注意,由于我可能需要多次调用函数someFunc ,因此正常的回调方法将无法正常工作。

如何将其翻译成我的代码? (我假设“async.whilst”是正确的方法。如果没有,请指出正确的方法)

听起来你想使用promises,假设你可以设置someFunc以便它返回一个promise。 你可以这样做:

var promise=new Promise().fulfill();
var totCount = 1000;
for (var x = 0 ; x < totCount ; x++) {
    promise=promise.then(function(){return someFunc(x, parm2, parm3, parm4);});
}
promise.then(function(){console.log("done");});

确切的语法取决于您选择使用的promises库。

假设someFunc是异步并将回调作为最后一个参数,以下示例将起作用。 它是否确实取决于它是如何实现的。 如果它可能是另一个库的一部分。

var count = 0;
var totCount = 1000;

async.whilst(
  function () { return count < totCount; },
  function (callback) {
    someFunc(count, parm2, parm3, parm4, callback);
    count++;
  },
  function (err) {
      // someFunc has been called totCount times, or an error has occured
  }
);

如果someFunc不是异步但你想异步运行循环以避免阻塞,你只需在函数调用后调用回调。

//...
  function (callback) {
    someFunc(x, parm2, parm3, parm4);
    count++;
    callback();
  },
// ...

更新

没有异步/承诺(未测试):

var count = 0;
var totCount = 1000;

function loop () {
  // Async lets you provide you own check-method
  if(count >= totCount) {
    // Async lets you provide your own done-method
    return done();
  }

  // Async does setImmediate/process.nextTick somewhere around here
  myFunc(count, param, param, function() {
    // Async checks for errors here
    count++;
    loop();
  });
}

function done () {
  // Async provides any errors here
  console.log("done");
}

我评论了异步做了一些额外的东西,这可能是好事(大多数情况下,查看特定的源代码,它非常容易阅读)。 例如,如果someFunc实际上不是异步但只是调用回调,那么就像使用for(...)一样杀死事件循环。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM