gpt4 book ai didi

javascript - 回调已在异步模块中调用

转载 作者:太空宇宙 更新时间:2023-11-04 00:48:53 24 4
gpt4 key购买 nike

我有以下数组:

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

我使用异步来访问此对象并将它们发送到提取,如下所示:

提取函数:

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

// return text
callback(text);
};

使用异步

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.

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

为了解决这个问题,我在异步中执行此操作:

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

所以会比较。文件大小与文本大小相同吗?是的?这样您就可以调用完成了。

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

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

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

Done was already called.

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

我该如何解决这个问题?我这里需要一盏灯:/

最佳答案

这段代码没有正确支撑,并且回调参数在几个地方没有处于正确的位置:

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)

关于javascript - 回调已在异步模块中调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33427747/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com