如何重复调用一个函数并等待下一次调用之前完成

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

本文关键字:调用 一次 函数 何重复 一个 等待      更新时间:2023-09-26

我使用node.js

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

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

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

我知道在node中,someFunc可以以任何顺序执行,但对于这种情况,它绝对必须以x = 0然后1然后2等方式执行。

似乎async库调用"async。而将做到这一点,但我有麻烦的例子翻译成我的现实生活中的代码。

下面是"async. while ": 的示例
var count = 0;
async.whilst(
    function () { return count < 5; },
    function (callback) {
        count++;
        setTimeout(callback, 1000);
    },
    function (err) {
        // 5 seconds have passed
    }
);

注意,由于我可能不得不多次调用函数someFunc,普通的回调方法将不起作用。

我如何把它翻译成我的代码?(我假设是"异步"。"而"是正确的方法。如果没有,请说明正确的方法)

下面的例子假设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();
  },
// ...

不使用async/promises(未测试):

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

我注释了async做了一些额外的东西,这些东西可能是很好的(大多数情况下,查看源代码以了解细节,它非常容易阅读)。例如,如果someFunc实际上不是异步的,而只是调用一个回调,这将像使用For(…)一样终止事件循环。

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

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库。