2017-07-18 2 views
0

J'ai une fonction async.each pour les choses suivantes dans une commande.Async.each: un seul rappel après tout exécuté

1.Prenez la taille de l'image à partir de la matrice.

2.Croissez l'image.

3.Téléchargez vers AWS s3.

Maintenant, je veux afficher un seul message de réussite après tout téléchargement.

async.each(crop_sizes,function (result,cb) { 
    //crop image 
    gm(path) 
      .resize(result.width, result.height,'^') 
      .crop(result.width, result.height) 
      .stream(function (err,buffer) { 
       //upload to s3 
      s3.upload(params,function(err,success){ 
        if(!errr){ 
        conseole.log(uploaded); 
        } 
       }) 
      }); 

    }); 

Il sortie comme

uploaded 
uploaded 
uploaded 
uploaded 

Mais je veux montrer un message de succès après tout téléchargement est-il possible avec async

+0

Il y a des fautes de frappe dans votre code. Quel est 'errr' je ne le vois pas défini nulle part. uploadé est une chaîne ou var? –

Répondre

-2

Je pense que vous devriez essayer d'attendre pour chaque « chaque » retour et puis console.log si vous pensez que tout va bien. A l'intérieur de votre async.each, à l'exception d'un code compliqué que vous ne serez pas en mesure de savoir que chaque « chacun » a bien fonctionné

2

Async.each prend une 3ème augment qui est:

A callback which is called when all iteratee functions have finished, 
or an error occurs. Invoked with (err). 

Vous voulez configurer ce troisième argument pour savoir quand tous les téléchargements ont été terminés ou si certains ont échoué.

https://caolan.github.io/async/docs.html#each

+1

Décrochage immédiat d'une réponse correcte sans explication ... – Shadowfool

2

(1) Lorsque vous travaillez async.js en général, vous devez toujours déclencher le rappel à savoir lorsque votre cb tâche complète ou même quand il y a une erreur. Il devrait également être une fois et pas plus pour chaque tâche. Si vous ne le déclenchez pas ou si vous ne le déclenchez pas plusieurs fois dans la même tâche, votre code risque de se bloquer ou vous obtiendrez une erreur, respectivement.

(2) async.each dispose de 3 arguments: coll, iteratee, callback. Vous n'utilisez que 2. Le dernier argument callback est déclenché lorsque toutes les tâches sont terminées.

async.each(crop_sizes, function task(result, cb) { 
    //crop image 
    gm(path) 
     .resize(result.width, result.height, '^') 
     .crop(result.width, result.height) 
     .stream(function (err, buffer) { 
      if (err) 
       return cb(err); // we use 'return' to stop execution of remaining code 
      //upload to s3 
      s3.upload(params, function(err,success){ 
       if (err) 
        return cb(err); 
       cb(null, success); 
      }); 

      // you could also simply do s3.upload(params, cb); 
     }); 
}, function allTasksAreDone (err) { 
    if (err) 
     console.log(err); 
    // do something now 
}); 

(3) Je pense que si vous voulez obtenir le résultat de chaque tâche, vous feriez mieux d'utiliser async.map. voici un example. La seule différence est que votre callback aura un argument supplémentaire donné qui est un tableau de tous vos success es.