已在异步模块中调用回调

时间:2015-10-30 02:30:18

标签: javascript node.js asynchronous

我有以下数组:

var files = [
 {
  name: 'myfile.txt'
 },
 {
  name: 'myfile2.txt'
 }
];

我正在使用异步访问此对象并将其发送到提取,如下所示:

提取功能:

var extraction = function(file, callback) {
  // extract

  // return text
  callback(text);
};

使用async

var fn = function(files, callback) {
  Async.mapLimit(files, 3000, function(file, done) {
   extraction(file, function(texts) {
     done(texts);
   });
  }
}, function(texts) {
  callback(texts);
}

我需要打电话:

fn(files, function(texts) {
 console.log(texts); // new objects, now with text's
});

像这样,我收到以下错误:

Done was already called.

发生这种情况是因为我无法在异步内部调用完成两种方式,而且我正在这样做。

围绕这个问题,我在Async中执行此操作:

if (files.length === texts.length) {
  done(texts);
}

所以会比较。文件大小与文本大小相同?是?所以你可以调用完成。

这将完美地运作。这个问题是我无法在else语句中传递错误参数,如下所示:

if (files.length === texts.length) {
  done(null, texts);
} else {
  done('ERROR'!);
}

首先因为会在每个循环中调用,因此会导致相同的错误:

Done was already called.

即使我可以,也会破坏循环,因为将在第一次循环中调用。

我该如何解决这个问题?我需要一个亮点:/

1 个答案:

答案 0 :(得分:0)

此代码没有正确支持,并且回调参数在几个地方的位置不正确:

var fn = function(files, callback) {
  Async.mapLimit(files, 3000, function(file, done) {
   extraction(file, function(texts) {
     done(texts);
   });
  }
}, function(texts) {
  callback(texts);
}

应该是:

var fn = function (files, callback) {
    Async.mapLimit(files, 3000, function (file, done) {
        extraction(file, function (texts) {
            done(null, texts);
        });
    }, function (err, texts) {
        callback(texts);
    });
}

Async.mapLimit()有四个参数。你没有正确传递第四个参数。实际上,如果您将代码粘贴到http://jshint.com/中,它会显示错误的位置(坦率地说,我对代码的运行感到惊讶)。

这篇文章向您展示了一些Async.mapLimit()编码示例,这些示例的工作方式就像您尝试的那样:Concurrency level (async.mapLimit)