Comment puis-je faire fonctionner ce travail en ligne async foreach avec des promesses?

J'ai déjà dérangé avec Promises, mais je suis nouveau pour eux et je ne peux pas comprendre comment le faire correctement. À l'heure actuelle, il n'y a aucun intérêt pour la promesse, car cela n'attend que l'async $.get finit.

Fondamentalement, chaque itération d'itération a sa propre fonction $.get , et je dois les avoir toutes terminées, puis continuer à la partie qui a la console.log "… gets albumart".

 $.get(id,function(data) { //(there's some code here) var getZippyUrls = new Promise(function(resolve) { zippyarray.forEach(function(zippy) { //(more code) $.get(zippy.full, function(data) { //^This is the foreach of $.gets //(code's here) }); resolve(zippyarray); }); }); //This is my failed Promise -> getZippyUrls.then(function(response) { console.log("WE'RE OUT " + response.length); response.foreach(function(d) { console.log("Promise"+d.media); }); console.log('eyyyyyy'); }); console.log("...gets albumart"); //Now after the previous stuff is done, move on 

Dans le code synchrone, la continuation est effectuée lorsque la ligne se termine ;

Avec des promesses, la continuation s'effectue via .then . Vous utilisiez un constructeur prometteur et l'avez résolu immédiatement, vous n'avez attendu aucune tâche. Je mapperait mon travail dans les tâches, puis je les chaînerais avec ou les attends en série.

 //I'm assuming zippyarray; // array of Zippy objects var tasks = zippyarray.map(function(zippy,i){ return function(){ // return a task on that zippy; // basic logic here return $.get({ // ajax request }).then(function(data){ // process data like in your code // possibly store later for later use too return process(data); // return the processed data; }); } }); 

Maintenant, nous pouvons les exécuter tous séquentiellement:

  var p = tasks[0](); // start the first one for(var i = 1; i < tasks.length; i++) p = p.then(tasks[i]); p.then(function(result){ // all available here }); 

Ou mieux, en série:

 $.when.apply(tasks.forEach(function(t){ return t(); })).then(function(results){ // all done }) 

Je sais que c'est une question ancienne, mais les choses ont changé un peu récemment.

Si vous utilisez bien des bibliothèques externes, la bibliothèque de promesses Bluebird a une très bonne mise en œuvre pour cela: Promise.each .

Par exemple

 function helperFunc(zippyarray) { return Promise.each(zippyarray, zippy => { return someOperationThatReturnAPromise(zippy) .then((singleResult) => { // do something with the operation result if needed }) }).then((originalArray) => { // this happens only after the whole array is processed // (result is the original array here) return Promise.resolve(originalArray) }) } 

Pour suivre les demandes multiples d'achat, vous utilisez cette méthode:

 var cnt = requestCnt; function finished(){ if(--cnt)return; // Your code here } for(var i = 0; i < requestCnt; ++i){ $.get('something.htm', {data:data}, function(data){ finished(); }); } 

Vous appelez toujours la fonction terminée lorsqu'une demande obtient une réponse. La fonction terminée fait le travail lorsque tout est terminé.