gpt4 book ai didi

javascript - asyncjs 回调未执行

转载 作者:行者123 更新时间:2023-12-02 23:54:30 24 4
gpt4 key购买 nike

我正在尝试合并两个 JSON 文件(客户列表)中的数据,然后创建与客户一样多的任务,以便稍后通过 async.js 执行

为了让所有任务数组填满,我用一个 promise 来控制 forEach 的结尾:

var parsePromise = new Promise(function (resolve, reject) {
mongoDB.MongoClient.connect(dbURL, (error, db) => {
originalData.forEach(function (element, index) {
var restoredCustomer = Object.assign(element, backupData[index]);

tasksArray.push((function (db, element) {
return function () {
db.collection('customers').insert(element, function (error) {
if (error) {
console.error("Error: ", error);
}
})
}
})(db, restoredCustomer));

forEachCounter--;
if (forEachCounter === 0) {
resolve(tasksArray);
}
});
});
});

然后,当 promise 结束时,我执行 async.js parallel 方法:

parsePromise.then(function (tasksArray) {
async.parallel(tasksArray, (err, results) => {
console.log("Operation completed successfully: ", results);
})
})

奇怪的是,代码工作正常,并且插入是在 MongoDB 上完成的,但是 console.log("Operationcompleted success: ", results); 放置在并行回调永远不会显示。

最佳答案

试试这个

var parsePromise = new Promise(function (resolve, reject) {
mongoDB.MongoClient.connect(dbURL, (error, db) => {
originalData.forEach(function (element, index) {
var restoredCustomer = Object.assign(element, backupData[index]);
tasksArray.push(function(cb){
db.collection('customers').insert(restoredCustomer, function (error) {
if (error) return cb(err);
cb();
})
});

forEachCounter--;
if (forEachCounter === 0) {
resolve(tasksArray);
}
});
});
});

根据async js文档 https://caolan.github.io/async/global.htmlasync.js 中并行函数中的任务参数必须是 AsyncFunction。AsyncFunction 需要有最后一个参数,即回调。回调的结构遵循function(err, args)的标准。

您还可以尝试将代码简化为:

new Promise((resolve, reject) => {
mongoDB.MongoClient.connect(dbURL, (error, db) => {
if (error) return reject(error);
resolve(db);
});
}).then(db => {
var tasksArray = [];
for (let i = 0; i != originalData.length; ++i){
var restoredCustomer = Object.assign(originalData[i], backupData[index]);
tasksArray.push(function(cb){
db.collection('customers').insert(restoredCustomer, function (error) {
if (error) return cb(err);
cb();
})
});
}

return new Promise((resolve, reject) => {
async.parallel(tasksArray, (err, results) => {
if (err) return reject(err);
resolve(results)
})
})
})

关于javascript - asyncjs 回调未执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55463132/

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