Node.js - Использование async lib - async.foreach с объектом

Я использую node async lib - https://github.com/caolan/async#forEach и хотел бы выполнить итерацию по объекту и распечатать его индексный ключ. После завершения я хотел бы выполнить обратный вызов.

Вот что я до сих пор, но 'iterating done' никогда не видел:

    async.forEach(Object.keys(dataObj), function (err, callback){ 
        console.log('*****');

    }, function() {
        console.log('iterating done');
    });  
  • Почему окончательная функция не вызвана?

  • Как распечатать ключ индекса объекта?

Ответ 1

Последняя функция не вызывается, потому что async.forEach требует, чтобы вы вызывали функцию callback для каждого элемента.

Используйте что-то вроде этого:

async.forEach(Object.keys(dataObj), function (item, callback){ 
    console.log(item); // print the key

    // tell async that that particular element of the iterator is done
    callback(); 

}, function(err) {
    console.log('iterating done');
});  

Ответ 2

async.each - очень полезная и мощная функция, предоставляемая Async Lib.it имеет 3 поля 1-коллекция/массив 2- итерация 3-обратный вызов сбор относится к массиву или коллекции объектов, итерация относится к каждой итерации, а обратный вызов является необязательным. если мы даем обратный вызов, тогда он вернет ответ или скажет результат, который вы хотите показать вам во внешнем интерфейсе

Применяет функцию итерации к каждому элементу в coll, параллельно. Итерация вызывается с элементом из списка и обратным вызовом, когда он закончил. Если итератор передает ошибку на обратный вызов, основной обратный вызов (для каждой функции) немедленно вызывается с ошибкой.

Обратите внимание, что поскольку эта функция применяется параллельно к каждому элементу параллельно, нет гарантии, что итерационные функции будут выполнены в порядке.

exapmle -

 var updateEventCredit = function ( userId, amount ,callback) {
    async.each(userId, function(id, next) {
    var incentiveData = new domain.incentive({
    user_id:userId,
        userName: id.userName,
        amount: id.totalJeeneePrice,
        description: id.description,
    schemeType:id.schemeType
    });

    incentiveData.save(function (err, result) {
        if (err) {
            next(err);
        } else {
                 domain.Events.findOneAndUpdate({
                    user_id: id.ids
                }, {
                    $inc: {
                        eventsCredit: id.totalJeeneePrice
                    }
                },{new:true}, function (err, result) {
                    if (err) {
                        Logger.info("Update status", err)
                        next(err);
                    } else {
                     Logger.info("Update status", result)
                     sendContributionNotification(id.ids,id.totalJeeneePrice);
                     next(null,null);       
                    }
                });
        }
    });