Ich würde sagen, die Daten in N Reihen zu spleißen, bevor Sie in Verhältnisse berechnen. Machen Sie die Berechnungsverhältnisse zu einer einzigen Funktion, dh. Dieser Teil Ihres Programms // do some calculations...
dann Promisify es mit Q.
Danach können Sie eine Reihe von Versprechen jedes Versprechen calculateRatiosForData(Nth row)
erstellen.
Danach können Sie einen Anruf an Promise.all(yourArrayOfCalculateRatioPromises)
.
Das Problem hier ist, dass Sie immer noch alle diese Daten im Browser berechnen werden. Wenn möglich, wäre es besser, diese Verarbeitung auf den Server zu übertragen und eine POST
Anfrage für das Computing zu verwenden. Die Versprechen Struktur wird immer noch gleich aussehen.
Es gibt auch die Frage, ob Sie diese berechnetenRatios für den Rest Ihres Skripts benötigen. Wenn Sie nicht gut, wenn Sie das tun, dann würden Sie nur den Rest des Skripts innerhalb der Promise.all(arrayOfPromises).then(function (result) { //rest of script}
kapseln. Das Schlüsselstück dieses Codes ist die . Dann (Funktion() {}).
Ich würde vorschlagen, mit WebWorkers aber leider sind sie nicht von IE8 unterstützt. Es gibt Problemumgehungen in google code und here aber ich kann nicht dafür bürgen, wie gut diese Optionen funktionieren.
EDIT: Dies wird zeigen, wie das Versprechen zu machen
Es gibt grundsätzlich zwei Möglichkeiten, dies zu tun.
1) Sie können die calculateRatios Funktion im Stil eines hinteren Knoten schreiben und es dann promisify Q. mit
function calculateRatios (arrayInput, callback) {
//error checking if error
//callback(error)
//calculate the ratios algorithm then do
setTimeout(callback(undefined, data), 500);
}
Und dann promisify es würde wie folgt aussehen:
var Promise = require('q'), //however you want to do this in the browser
calculateRatiosAsync = Promise.promisify(calculateRatios);
Ich persönlich mag diesen Weg, weil er mit anderen Control-Flow-Bibliotheken kompatibel ist, ohne die ursprüngliche Funktion ändern zu müssen, oder Sie können einfach die ursprüngliche Funktion so verwenden, wie Sie sie haben, wenn es nicht notwendig ist, sie zu promiden.
2) Der andere Weg ist explizit ein Versprechen zu erstellen.
var Promise = require('q'),
calculateRaiosAsync = function (input) {
var d = Promise.defer();
//do your error checking if error
d.reject();
//do your calclate ratios algorithm and store the data in a variable
setTimeout(d.resolve(yourFinishedData), 500);
//return your promise
return d.promise();
}
HINWEIS: Es sollte beachtet werden, dass Sie das Versprechen Bibliothek anders erfordern müssen, aber ich überlasse das Ihnen.
Ich habe http://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-asynchronous-call?rq=1 gelesen, aber ich habe wirklich Mühe zu verstehen, wie um es an meinen bestehenden Code anzupassen. Ich habe viele synchrone Funktionen außerhalb von 'combineData', muss ich wirklich alle asynchron ändern? – Richard
Gibt es eine Möglichkeit, die Rechenraten auf dem Server zu berechnen? – RadleyMith
Werfen Sie einen Blick auf http://stackoverflow.com/q/6864397/1048572, http://stackoverflow.com/q/714942/1048572. Und ja, Sie müssen alles, was von den Ergebnissen abhängt, ändern, um mit Async umzugehen. – Bergi