web-dev-qa-db-fra.com

Node.js - Utilisation de la lib. Async - async.foreach avec object

J'utilise le node async lib - https://github.com/caolan/async#forEach et souhaite parcourir un objet et imprimer sa clé d'index. Une fois terminé, je voudrais exécuter un rappel.

Voici ce que j'ai jusqu'à présent mais le 'iterating done' n'est jamais vu: 

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

    }, function() {
        console.log('iterating done');
    });  
  1. Pourquoi la fonction finale n'est-elle pas appelée?

  2. Comment puis-je imprimer la clé d'index d'objet?

51
Ben

La fonction finale n'est pas appelée car async.forEach requiert que vous appeliez la fonction callback pour chaque élément.

Utilisez quelque chose comme ceci:

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');
});  
119
stewe

async.each est une fonction très utile et puissante qui est fournie par Async Libération. Elle a 3 champs 1-collection/array 2-itération 3-callback ou une collection d'objets et une itération est référée à chaque itération et le rappel est facultatif . si nous donnons un rappel, il retournera la réponse ou le résultat que vous voulez montrer dans l'interface

Applique la fonction iteratee à chaque élément en coll, en parallèle. L'itéré est appelé avec un élément de la liste et un rappel pour le moment où il est terminé. Si l'itéré transmet une erreur à son rappel, le rappel principal (pour chaque fonction) est immédiatement appelé avec l'erreur.

Notez que, puisque cette fonction applique iteratee à chaque élément en parallèle, il n’est pas garanti que les fonctions iteratee se termineront dans l’ordre.

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