0

我正在使用 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”是正确的方法。如果不是,请指定正确的方法)

4

2 回答 2

1

听起来你想使用承诺,假设你可以设置 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");});

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

于 2013-06-18T13:35:45.383 回答
1

以下示例将假设 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");
}

我评论了 async 在哪里做了一些可能很好的额外东西(大致上,请查看源代码以了解细节,它非常容易阅读)。例如,如果 someFunc 实际上不是异步的,而只是调用一个回调,这将像使用 for(...) 一样终止事件循环。

于 2013-06-18T13:40:40.220 回答