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);
}
});
}
});