Как заставить async.each ждать завершения .save ()?

1

Я пытаюсь сохранить некоторые данные в своей коллекции, используя mongoose.

//tried with async each
async.each(indexes, function(index, callback) {
            newChampion.ID = champions[index].id;
            newChampion.Key = champions[index].key;
            newChampion.Name = champions[index].name;
            newChampion.Title = champions[index].title;
            Champion.addChampion(newChampion, function(err) {
                if (err) {
                    console.log(err.message);
                    callback();
                } else {
                    callback();
                }
});

Проблема в том, что он толкает меня только значение, соответствующее последнему индексу (из 133 значений). У меня уникальный идентификатор, поэтому в базе данных сохраняется только одно значение. Я поместил console.log в функцию addChampion, и в 133 раза я вижу одно и то же значение. Добавьте нижеприведенный фрагмент:

module.exports.addChampion = function(newChampion, callback) {
    newChampion.save(callback);
}

Как я решаю эту проблему, чтобы все 133 значения были введены в БД?

  • 0
    Я бы рекомендовал не иметь только один объект newChampion а создать 133 из них в цикле ...
Теги:
mongoose

1 ответ

0

Асинхронное задание с моим локальным mysql:

let async = require('async');
let mysql = require('mysql');

var conn = mysql.createConnection({
    host: 'localhost',
    user: 'root',
    password: 'xxxxx',
    database: 'xxxxx',
    port: 3306
});

var sqls = [
    'select id from record where id = 1',
    'select id from record where id = 2',
    'select id from record where id = 3',
    'select id from record where id = 4',
    'select id from record where id = 5'
];

async.each(sqls, function(sql, callback) {
    console.log(sql);
    conn.query(sql, function (err, res) {
        console.log(res);
    });
});
### output ###
select id from record where id = 1
select id from record where id = 2
select id from record where id = 3
select id from record where id = 4
select id from record where id = 5
[ RowDataPacket { id: 1 } ]
[ RowDataPacket { id: 2 } ]
[ RowDataPacket { id: 3 } ]
[ RowDataPacket { id: 4 } ]
[ RowDataPacket { id: 5 } ]

Простой случай с не очень асинхронной работой:

let async = require('async');

let addChampion = function(newChampion, callback) {
    console.log(newChampion)
}

indexes = [1, 2, 3];
async.each(indexes, function(index, callback) {
    newChampion = {};
    newChampion.ID = index;
    addChampion(newChampion, function(err) {
        if (err) {
            console.log(err.message);
        }
    })
});

### output ###
{ ID: 1 }
{ ID: 2 }
{ ID: 3 }

Вы проверили бы свой newChampion прежде чем переходить в функцию addChampion? Это действительно связано с тем же индексом на консоли.

  • 1
    Ответ можно улучшить, указав, что один и тот же объект newChampion используется для каждой записи в indexes . Если each функция выполняется для всех записей в indexes до того, как addChampion получит обновить базу данных, все обновления будут выполняться для последней обработанной записи индекса.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню