2015-08-25 10 views
6

Veri ağırlıklı bir web sitesiyle çalışıyorum ve IE8'i desteklemem gerekiyor. IE8'de bazı "yavaş çalışan komut dosyaları" hatalarını alıyorum, bu yüzden kodlarımı eski tarayıcılar için döngüleri sırasında periyodik olarak duraklatmaya uyarlıyorum.JavaScript: Eşzamanlı kodu IE8'i desteklemek için uyumsuz duruma getirin mi?

Bu benim şimdiki kodudur:

combineData: function(xData, yData, values) { 
    var combinedData = this.combineDatasets(xData, yData, values.x, values.x_val); 
    combinedData = this.calculateRatiosForData(combinedData); 
    // various other data operations, then continue to set up chart... 
}, 

calculateRatiosForData: function(data, isSpecialDenominator, x_val_key) { 
    _.each(data, function(d, i) { 
     // do some calculations... 
    }); 
    return data; 
}, 

nasıl bir seferde N satır işlemek için calculateRatiosForData uyum sağlayabilir, Sonra ara?

Bu, eşzamansız hale getirecek ve kodumu buna göre uyarlamaya çalışıyorum.

Elbette IE8'de desteklenmesi gereken her şey, elbette!

+0

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

+0

Sunucudaki hesap oranlarını yapmanın herhangi bir yolu var mı? – RadleyMith

+0

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

cevap

5

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.

+0

teşekkürler, bazı örnek kodlar verebilir misiniz? – Richard

+0

neye bir örnek istiyorsun ... Bağıma ihtiyacım var. Bir sözün nasıl yaratılacağını görmek ister misin? Sunucuya bir POST isteğinin nasıl yapıldığını görmek ve bununla ilgili vaatler kullanmak ister misiniz? Tarayıcıda daha büyük bir hesaplama yapamazsanız, tarayıcıda daha büyük bir hesaplama yapamazsınız ya da sunucuyu daha verimli hale getirmezseniz, tarayıcıda büyük bir hesaplama yapamazsınız. – RadleyMith

+0

Teşekkürler! Ben sadece tam anlamıyla hesaplamak nasıl bilmek istiyorum 'CalculateRatiosForData 'böylece bir seferde 1000 satır hesaplar, daha sonra yarım saniye beklemek ve bitene kadar geri dönmek değil. IE8'de çalışan bir şekilde. Kesinlikle sunucuya bir şey göndermek istemiyorum. Tarayıcıdaki büyük hesaplama tüm modern tarayıcılarda iyi çalışır. – Richard

İlgili konular