包含功能的同步运行

时间:2015-12-28 14:49:29

标签: javascript node.js asynchronous

我有一个关于包含函数的同步运行的问题。例如,我有以下代码。

partitions(dataset, num_of_folds, function(train, test, fold) {
  train_and_test(train,test, function(err, results)
  {
  })
})

其中partitions运行num_of_folds次,对于不同的折叠,它会返回不同的列车和测试集。我想仅在train_and_test完成时运行每个分区迭代。怎么做?

2 个答案:

答案 0 :(得分:1)

鉴于您之前的问题:Optimum async flow for cross validation in node.js,我了解partition是您自己的函数,它将数据集拆分为多个部分,然后运行回调(此处基本为train_and_test)每个部分。

现在你的问题是train_and_test是异步的,但是你想等待每次调用完成(这是由我自己调用的回调信号),然后运行下一个调用。

一个简单的解决方案是更改代码以保持状态,并从回调中运行下一个调用。例如:

exports.partitions = function(dataset, numOfPartitions, callback) {
    var testSetCount = dataset.length / numOfPartitions;
    var iPartition=0;
    var iteration = function() {
        if (iPartition<numOfPartitions)
        {
            var testSetStart = iPartition*testSetCount;
            var partition = exports.partition(dataset, testSetStart, testSetCount);
            callback(partition.train, partition.test, iPartition, iteration);
            iPartition++;
        }
    };
    iteration();
};

然后,您需要将附加回调传递给异步函数:

partitions(dataset, num_of_folds, function(train, test, fold, callback) {
  train_and_test(train,test, function(err, results)
  {
      callback();
  })
});

请注意,我还没有测试过上面的任何代码。

答案 1 :(得分:0)

  

我想只在train_and_test完成时才运行分区的每次迭代。怎么做?

完全取决于partitions如何调用您提供的回调。如果partitions通常调用回调,那么它将等待回调完成后再继续。但是,如果它是异步调用,例如通过nextTicksetTimeout或类似,那么你能够告诉它等待的唯一方法就是它提供了一种告诉它的方法这一点。

如果我以另一种方式阅读您的问题:如果train_and_test是异步的,partitions并非设计用于处理异步回调,则无法让它等待。