我有以下数组:
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.
即使我可以,也会破坏循环,因为将在第一次循环中调用。
我该如何解决这个问题?我需要一个亮点:/
答案 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)