2017-06-28 1 views
0

J'ai des problèmes avec l'utilisation de async.eachLimit. Il fonctionne correctement pour les 10 premiers éléments, mais il ne continue pas après cela; ça finit simplement. Donc, s'il y a 100 éléments, il ne fait que les 10 premiers. C'est clairement un problème de me rappeler les rappels. Quelle est la bonne façon d'utiliser eachLimit avec une fonction externe qui ne contient pas de callback? Ou est-il nécessaire pour une telle fonction d'en avoir un?Comment utiliser correctement Javascript Async eachLimit

async.eachLimit(items, 10, function(item, callback) { 
     outsideFunction(item.attrOne, item.attrTwo}; 
     //callback(); ---> leads to all running in parallel. 
    }, 
    function(err) { 
     console.log(err); 
    } 
); 
+1

Que voulez-vous dire par «une fonction externe qui ne contient pas de rappel»? Est-ce que c'est asynchrone du tout? Si oui, comment savez-vous que c'est terminé quand il n'y a pas de rappel? – Bergi

Répondre

0

Votre question est que vous êtes ici en utilisant une bibliothèque de async pour une fonction qui n'est pas asynchrone (ou non d'agir comme il est asynchrone). Ce que async.eachLimit fait est de parcourir chaque élément du tableau, en exécutant seulement limit montant à la fois, et attend callback() pour être appelé en disant que l'itération en cours est terminée et peut en ajouter une autre à exécuter.

Dans votre exemple de code, le rappel (lorsqu'il n'est pas commenté) est appelé immédiatement après avoir tenté d'appeler outsideFunction car l'appel de fonction est non bloquant. Il n'attend pas parce que async dit "On m'a dit que c'est fait, je vais passer au suivant" donc tous les 100 vont essayer d'être exécutés en même temps. Si outsideFunction est une fonction asynchrone, a besoin de un rappel (ou avoir des promesses d'utilisation) pour dire qu'il a fini d'exécuter, et à l'intérieur de ce rappel vous appelez le rappel pour async.eachLimit et alors il ne fera que 10 à la fois dans le chemin tu veux. Voici un exemple:

async.eachLimit(items, 10, function(item, callback) 
{ 
    outsideFunction(item.attrOne, item.attrTwo, function(someResult) 
    { 
     // Your outside function calls back saying it's finished ... 
     callback(); // ... so we tell async we're done 
    }); 
}, 
function(err) 
{ 
    console.log(err); 
}); 

Si outsideFunction n'est pas votre fonction, et la fonction est en fait asynchrone, alors il est soit à l'aide de promesses ou vous avez besoin de trouver une bibliothèque qui écrit des fonctions asynchrones correctement. Si la fonction n'est pas asynchrone, alors async.eachLimit ne fonctionnera pas.

Si c'est votre fonction, vous devriez lui faire renvoyer un rappel pour dire que c'est fait (ou utiliser des promesses).