обратный вызов asyncjs не выполняется - PullRequest
0 голосов
/ 01 апреля 2019

Я пытаюсь объединить данные из двух файлов JSON (список клиентов), а затем создать столько задач, сколько клиентов будет выполнено позже, с помощью async.js

Чтобы заполнить весь массив задач, я контролирую завершение 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);
            }
        });
    });
});

Затем, когда обещание заканчивается, я выполняю async.js parallel method:

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

Странная вещь в том, что код работает нормально, а вставки выполняются в MongoDB, однако console.log("Operation completed successfully: ", results);, помещенный в обратный вызов parallel, никогда не выполняетсяпоказано на рисунке.

1 Ответ

1 голос
/ 02 апреля 2019

Попробуйте это

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.html Аргументы задач в параллельной функции в async.js должны быть AsyncFunction. AsyncFunction требует наличия последнего параметра, который является обратным вызовом. Структура обратного вызова соответствует стандарту функции (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)
    })
  })
})
...