2012-04-30 14 views
48

Sto usando il nodo asincrono lib - https://github.com/caolan/async#forEach e vorrei iterare attraverso un oggetto e stampare la sua chiave di indice. Una volta completato, vorrei eseguire una richiamata.Node.js - Uso della lib async - async.foreach con oggetto

Ecco quello che ho finora, ma la 'iterating done' è mai visto:

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

    }, function() { 
     console.log('iterating done'); 
    }); 
  1. Perché la funzione finale non ottenere chiamato?

  2. Come posso stampare la chiave indice dell'oggetto?

risposta

114

L'ultima funzione non viene chiamato perché async.forEach richiede che si chiama la funzione callback per ogni elemento.

Utilizzare qualcosa di simile:

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

Grazie @stewe sapevo che era qualcosa di semplice! Saluti, Ben. – Ben

+3

Il codice sopra non chiama la funzione 'callback' per ogni iterazione? Dovrebbe essere qualcosa come 'count ++; if (dataObj.length == count) callback(); 'dove la nuova variabile' var count = 1; 'è dichiarata prima di chiamare il ciclo 'async.forEach' ?? –

+1

Grazie mille per questo! –

0

async.each è molto utile e potente funzione offerta da Async Lib .it ha 3 campi 1-collection/array 2- iterazione 3 callback la raccolta è riferita alla matrice o collezione di oggetti e l'iterazione si riferisce a ciascuna iterazione e la richiamata è facoltativa. in caso di callback, restituirà la risposta o pronuncerà il risultato che si desidera mostrare nel frontend

Applica la funzione iteratee a ciascun elemento in coll, in parallelo. L'iteratee viene chiamata con un elemento dall'elenco e una richiamata per quando è finita. Se l'iterate passa un errore al suo callback, il callback principale (per ciascuna funzione) viene immediatamente chiamato con l'errore.

Nota: poiché questa funzione applica iteratee a ciascun elemento in parallelo, non è possibile garantire che le funzioni iteratee vengano completate in ordine.

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