Oranları hesaplamaya başlamadan önce verileri N satırlarına ekleyebilirim. Hesaplama oranlarını tek bir fonksiyon olarak yapın. Programınızın bu bölümü // do some calculations...
daha sonra Q kullanarak bunu promisify. Bundan sonra, herbiri calculateRatiosForData(Nth row)
olarak vaat edilen bir sözler dizisi yaratabilirsiniz.
Bundan sonra Promise.all(yourArrayOfCalculateRatioPromises)
numaralı telefonu arayabilirsiniz. Buradaki sorun, tarayıcıdaki tüm bu verileri hala hesaplayabilmenizdir. Mümkünse, bu işlemin sunucuya yüklenmesi ve bilgisayar için bir POST
isteğinin kullanılması daha iyi olacaktır. Sözün yapısı hala aynı görünecek.
Ayrıca, komut dosyanızın geri kalanı için bu hesaplanmış rapolara ihtiyacınız olup olmadığına dair bir sorun da vardır. Harika olmazsanız, eğer yaparsanız, o zaman komut dosyasının geri kalanını Promise.all(arrayOfPromises).then(function (result) { //rest of script}
'un içine kaplarsınız. Bu kodun anahtar parçası, .then (işlev() {}).
WebWorkers'u kullanmanızı öneririm, ancak IE8 tarafından desteklenmezler. google code ve ayrıca here adreslerinde bulunan geçici çözümler vardır, ancak bu seçeneklerin ne kadar iyi çalışacağını anlatamam.
DÜZENLEME: Bu bunu yapmanın iki yolu temelde vardır sözünü
nasıl gösterecektir.
1) Geri bir düğüm tarzında calculateRatios işlevi yazıp sonra Q
function calculateRatios (arrayInput, callback) {
//error checking if error
//callback(error)
//calculate the ratios algorithm then do
setTimeout(callback(undefined, data), 500);
}
kullanarak promisify Ve sonra şu şekilde görünecektir promisify yapabilirsiniz:
var Promise = require('q'), //however you want to do this in the browser
calculateRatiosAsync = Promise.promisify(calculateRatios);
Ben şahsen bu şekilde hoşlanıyorum çünkü orijinal işlevi değiştirmek zorunda kalmadan diğer kontrol akış kitaplıkları ile uyumlu ya da orijinal işlevi, onu proaktif hale getirmek için gerekli değilse kullanabilirsiniz. 2) Diğer yol, açık bir şekilde söz vermektir.
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();
}
NOT: Size farklı söz kütüphanesi gerekli zorunda olacağını belirtmek gerekir, ama o kadar size bırakıyorum.
http://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-asynchronous-call?rq=1 adresini okudum ancak gerçekten nasıl olduğunu anlamaya çalışıyorum mevcut koduma uyarlamak için. CombineData' dışında çok fazla senkronizasyon fonksiyonum var, bunların hepsini senkronize olmayan bir şekilde değiştirmem gerekiyor mu? – Richard
Sunucudaki hesap oranlarını yapmanın herhangi bir yolu var mı? – RadleyMith
http://stackoverflow.com/q/6864397/1048572, http://stackoverflow.com/q/714942/1048572 adresine bakın. Ve evet, async ile başa çıkmak için sonuçlarına bağlı olan her şeyi değiştirmelisiniz. – Bergi