2017-03-15 2 views
-2

Avec le code suivant, puis-je être sûr que le dernier rappel retournera les variables mises à jour?emboîtées fonctions async

var a = 0; 
async.forEach(collectionarray, function(item, cb1) { 
    async.forEach(collection.anotherarray, function(item, cb2) { 
     a += item.number; 
     cb2(); 
    }, function(err) { 
     if(err) console.log(err); 
    }) 
    cb1(); 
}, function(err) { 
    if(err) console.log(err); 
    console.log(a); // will this be updated for all the collection.anotherarray.number ? 
}) 
+1

Vous êtes censé passer 'cb1' dans le' forEach' intérieur comme le rappel, ne pas appeler immédiatement! – Bergi

+0

@Bergi vous voulez dire l'appeler dans le rappel final sur l'async interne? –

Répondre

0

Le troisième paramètre de .forEach a un double objectif: comme un rappel lorsque toutes les itérations sont faites, ou pour signaler une erreur. Appelez cb1() l'intérieur de ce rappel sur la .forEach intérieure:

var a = 0; 
async.forEach(collectionarray, function(item, cb1) { 
    async.forEach(collection.anotherarray, function(item, cb2) { 
     a += item.number; 
     cb2(); 
    }, function(err) { 
     if(err) console.log(err); 
     cb1(); 
    }); 
}, function(err) { 
    if(err) console.log(err); 
    console.log(a); 
}) 

L'approche que vous avez écrit sera presque certainement pas fonctionner correctement. L'extérieur .forEach supposera que c'est fait beaucoup trop tôt.