Angenommen, ich habe ein Array und eine Funktion A:

var array = ['a', 'b', 'c'];
function A(p) { ... };

Jetzt möchte ich jedes Element von array an die Funktion A übergeben und möchte, dass sie in einer sequentiellen Reihenfolge ausgeführt werden. Normalerweise gibt es kein Problem. Ich kann:

array.forEach(function(item) {
  A(item);
}

Wenn jedoch in A eine asynchrone Aktion vorhanden ist, wird alles durcheinander gebracht. Die Frage ist also:

Wie kann ich sie ordnungsgemäß ausführen lassen, auch wenn in A asynchrone Aktionen vorhanden sind?

Damit meine ich, dass A ('b') ausgeführt werden soll, nachdem A ('a') vollständig beendet ist (einschließlich aller darin enthaltenen asynchronen Aktionen).

Ich denke, es muss schon einige Dienstprogramme gegeben haben, die solche Dinge tun. Kann mir jemand etwas Licht ins Dunkel bringen?

3
yaoxing 17 Aug. 2015 im 12:33

3 Antworten

Beste Antwort

Dies ist ein perfekter Anwendungsfall für "eachSeries" von async.js

Sie könnten es so verwenden

async.eachSeries(array, A, function(err) {
    // this function gets called at the end 
    // after your array has been looped
});

Und Sie müssten Ihre A-Funktion mit einem zweiten Parameter ändern - einem Rückruf.

function A(p, callback) {
    // ...
    return callback();
}

Dadurch wird der Rückrufparameter aufgerufen, sobald Ihre asynchronen Aufrufe in A abgeschlossen sind.

7
thomas 17 Aug. 2015 im 09:40

Mit JavaScript Versprechen können Sie genau das tun.

Dieses Beispiel ist ziemlich kompliziert, zeigt jedoch einige Aspekte der Verwendung von Versprechen:

var arr = ['a', 'b', 'c'];

function processAsync(val) {
  return new Promise(function(res, rej) {
    console.log("Starting:", val);
    setTimeout(function () {
      console.log("Done:", val);
      res();
    }, 1000);
  });
}

arr.reduce(function(promise, i) {
  return promise.then(processAsync.bind(null, i));
}, Promise.resolve());
3
Amit 17 Aug. 2015 im 10:01
var array = ['a', 'b', 'c'],i = 0;
var A = function(p){
    //some code
    $.ajax({
        success:function(){
            try{
                A(item[++i]);
            }catch{
                return;
            }
        }
    });
}

Bist du gemein dazu?

0
shut up and stand up 17 Aug. 2015 im 10:03