2015-11-10 9 views
6

Die Situation ist, dass ich dynamisch eine Reihe von Skripts von einer API laden, die ich dann über eval() aufrufen. Es ist mir egal, in welcher Reihenfolge die Skripte aufgerufen werden, aber ich möchte nicht, dass sie gleichzeitig aufgerufen werden. Das heißt, die Skripte A, B und C können in der Reihenfolge C, B, A zurückgegeben werden, und ich möchte sofort mit eval(C) beginnen, wenn C zurückgegeben wird, aber ich möchte eval(B) warten, bis eval(C) abgeschlossen ist.Ausführen von Skripten von .each() synchron, aber ohne Verzögerung in der Reihenfolge der Fertigstellung

Ohne in den voll behaarten Code zu kommen, hier ist das Herz davon, wo "Instanzen" ein String-Array ist.

$.each(instances, function(index, instance) { 
    var apiUrl = "http://the-api-url.com/" + instance; 
    $.getJSON(apiUrl, function(data) { 
     // except I don't want to eval here as evaluations may overlap 
     eval(data.script); 
    }); 
}); 

Von dem, was ich verstehe, konnte ich .when() nutzen zu warten, bis alle vollständig waren, aber das würde Zeit verschwenden, wie ich brauche nicht zu warten, bis alles in Ordnung heruntergeladen wird ihre Ausführung zu beginnen.

+1

Lesen Sie über Versprechen in ES5. – Niloct

+1

Wenn Sie sagen, dass sie heruntergeladen und in beliebiger Reihenfolge ausgeführt werden können, aber die Aufrufe von 'eval()' sich nicht "überlappen" können, haben Sie diesen Code bereits geschrieben. –

+0

Testen Sie Async-Operationen? Sonst sehe ich kein Problem in deiner Logik. –

Antwort

9

Es ist ein wenig unklar von Ihrer Frage, aber vorausgesetzt, dass die Skripte in beliebiger Reihenfolge ausgeführt werden können (A, B, C, A, C, B, B, A, C, etc.), dann müssen Sie nichts ändern.

Javascript (im Browser) ist single threaded, so dass die Rückrufe, die Sie an $.getJSON übergeben, seriell geplant werden.

+0

Hinzugefügt _ (im Browser) _ weil ich glaube, dass es einige Umgebungen gibt (Knoten?), Wo Sie Dinge parallel tun können, aber ich könnte mich darin irren. –

+0

Sogar im Browser können Sie Webworkers mit einigen Einschränkungen ausführen, aber ... Ich denke, Ihre Antwort ist genug :) –

+0

Vielen Dank! Das ist eine Erleichterung. –