node async.parallel并行执行 报Callback was already called错误怎样解决?
async.parallel([
function (callback) {
self.getNewsByTime().then(function (newsData) {
self.emit('addToLife', newsData, extras, function (err, extras) {
if (err){
next(err, null)
} else {
next(null, extras)
}
});
});
},
function (callback) {
self.getUpdateNewsByTime().then(function (updateNewsData) {
if (updateNewsData.length>0) {
self.emit('updateToLife', updateNewsData, extras, function (err, extras) {
if (err){
next(err, null)
} else {
next(null, extras)
}
});
}
});
},
function (callback) {
self.getDeleteNewsByTime().then(function (deleteNewsData) {
if (deleteNewsData.length>0){
self.emit('deleteFromLife', deleteNewsData, extras, function (err, extras) {
if (err){
next(err, null)
} else {
next(null, extras)
}
});
}
});
}
],
function (err, results) {
console.log(results);
})
async.parallel
是Node.js中async库提供的一个函数,用于并行执行多个异步任务。当所有任务都完成后,它会调用回调函数。如果在某个任务的回调函数中错误地调用了回调多次,就会抛出"Callback was already called"错误。
解决这个问题的方法主要是确保每个任务的回调只被调用一次。例如:
```javascript const async = require('async');
async.parallel({ one: function(callback) { // 异步操作 setTimeout(function() { callback(null, 1); // 只调用一次callback,且第一个参数为null表示没有错误 }, 200); }, two: function(callback) { setTimeout(function() { callback(null, 2); // 同样,这里也只调用一次callback }, 100); } }, function(err, results) { // results现在是一个对象,包含了上面两个任务的结果:{one: 1, two: 2} if (err) { // 处理错误 console.error('Error:', err); } else { console.log('Results:', results); } }); ```
如果你在处理异步任务时有可能需要提前返回(比如遇到错误),确保你已经正确处理了这种情况,仍然只调用一次回调,并将错误作为第一个参数传入:
javascript
two: function(callback) {
if (/* 遇到错误 */) {
callback(new Error('An error occurred')); // 在错误情况下调用回调
} else {
setTimeout(function() {
callback(null, 2); // 正常情况下调用回调
}, 100);
}
}