2015-08-25 8 views
6

मैं डेटा-भारी वेबसाइट के साथ काम कर रहा हूं और मुझे आईई 8 का समर्थन करने की आवश्यकता है। मुझे IE8 में कुछ "धीमी गति से चलने वाली स्क्रिप्ट" त्रुटियां मिल रही हैं, इसलिए मैं पुराने ब्राउज़र के लिए लूप के दौरान समय-समय पर रोकने के लिए अपना कोड अनुकूलित कर रहा हूं।जावास्क्रिप्ट: आईई 8 का समर्थन करने के लिए सिंक्रोनस कोड एसिंक होने के लिए अनुकूलित करें?

यह मेरे वर्तमान कोड है:

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; 
}, 

मैं calculateRatiosForData कैसे अनुकूलन एक समय में एन पंक्तियों पर कार्रवाई करने के कर सकते हैं, तो थामने?

यह इसे असीमित बना देगा, और मैं इसे संभालने के लिए अपने कोड को अनुकूलित करने के लिए संघर्ष कर रहा हूं।

जो कुछ भी मुझे आईई 8 में समर्थित होना चाहिए, ज़ाहिर है!

+0

मैं पढ़ रहा हूं http://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-asynchronous-call?rq=1 लेकिन मैं वास्तव में समझने के लिए संघर्ष कर रहा हूं कि कैसे इसे अपने मौजूदा कोड में अनुकूलित करने के लिए। मेरे पास 'combineData' के बाहर बहुत सारे सिंक्रोनस फ़ंक्शन हैं, क्या मुझे वास्तव में उन सभी को अतुल्यकालिक बनाने की आवश्यकता है? – Richard

+0

क्या कोई तरीका है कि आप सर्वर पर गणना अनुपात करते हैं? – RadleyMith

+0

http://stackoverflow.com/q/6864397/1048572, http://stackoverflow.com/q/714942/1048572 पर एक नज़र डालें। और हां, आपको एसिंक से निपटने के परिणामों के आधार पर जो कुछ भी निर्भर करता है उसे बदलने की आवश्यकता होगी। – Bergi

उत्तर

5

मैं गणना अनुपात में आने से पहले डेटा को एन पंक्तियों में विभाजित करने के लिए कहूंगा। गणना अनुपात को एक ही समारोह यानी बनाओ। आपके प्रोग्राम // do some calculations... का यह हिस्सा Q का उपयोग करके इसे प्रमाणित करें।

इसके बाद आप calculateRatiosForData(Nth row) होने वाले प्रत्येक वादे के वादे का एक सरणी बना सकते हैं।

इसके बाद आप Promise.all(yourArrayOfCalculateRatioPromises) पर कॉल कर सकते हैं।

यहां मुद्दा यह है कि आप अभी भी ब्राउज़र पर उस डेटा का कंप्यूटिंग करेंगे। यदि संभव हो तो सर्वर पर उस प्रसंस्करण को ऑफ़लोड करना बेहतर होगा और कंप्यूटिंग के लिए POST अनुरोध का उपयोग करना बेहतर होगा। वादा संरचना अभी भी वही दिखाई देगी।

यह भी मुद्दा है कि आपको अपनी शेष स्क्रिप्ट के लिए इन गणनाओं की आवश्यकता है या नहीं। यदि आप महान नहीं हैं, तो यदि आप करते हैं तो आप Promise.all(arrayOfPromises).then(function (result) { //rest of script} के अंदर बाकी स्क्रिप्ट को बस समाहित करेंगे। उस कोड का मुख्य भाग है .थ (फ़ंक्शन() {})

मैं WebWorkers का उपयोग करने का सुझाव दूंगा लेकिन हां वे IE8 द्वारा समर्थित नहीं हैं। google code और here में पाए गए वर्कअराउंड हैं लेकिन मैं यह नहीं देख सकता कि वे विकल्प कितने अच्छे काम करेंगे।

संपादित करें: यह कैसे वादा

बनाने के लिए मूल रूप से यह करने के लिए दो तरीके हैं दिखाएगा।

1) आप वापस एक नोड की शैली में calculateRatios समारोह लिख सकते हैं और उसके बाद प्र

function calculateRatios (arrayInput, callback) { 
    //error checking if error 
    //callback(error) 

    //calculate the ratios algorithm then do 
    setTimeout(callback(undefined, data), 500); 
} 

का उपयोग कर इसे promisify और फिर यह इस प्रकार दिखाई देगा promisify रहे हैं:

var Promise = require('q'), //however you want to do this in the browser 
    calculateRatiosAsync = Promise.promisify(calculateRatios); 

मैं व्यक्तिगत रूप से इस तरह से पसंद करता हूं क्योंकि यह मूल कार्य को बदलने के बिना अन्य नियंत्रण प्रवाह पुस्तकालयों के साथ संगत है, या आप इसे मूल रूप से मूल कार्य का उपयोग कर सकते हैं यदि आपके पास इसे प्रचारित करने के लिए आवश्यक नहीं है।

2) दूसरा तरीका स्पष्ट रूप से वादा करना है।

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(); 
    } 

नोट: यह ध्यान देने योग्य है कि आप वादा पुस्तकालय अलग ढंग से की आवश्यकता होती है करना होगा, लेकिन मुझे लगता है कि आप पर निर्भर छोड़ दें।

+0

धन्यवाद, क्या आप संभवतः कुछ उदाहरण कोड दे सकते हैं? – Richard

+0

आप किस उदाहरण का चाहते हैं ... मुझे संदर्भ की आवश्यकता है। क्या आप देखना चाहते हैं कि वादा कैसे बनाया जाए? क्या आप देखना चाहते हैं कि सर्वर को POST अनुरोध कैसे करें और इसके साथ वादे का उपयोग करें? आप वास्तव में ब्रोवर में बड़ी गणना नहीं कर सकते हैं जब तक आप एल्गोरिदम को अधिक कुशल नहीं बनाते या आप सर्वर पर इसे ऑफ़लोड नहीं करते हैं। – RadleyMith

+0

धन्यवाद! मैं सचमुच देखना चाहता हूं कि 'गणना डेटा अनुपात' को कैसे अनुकूलित किया जाए, इसलिए यह एक समय में 1000 पंक्तियों की गणना करेगा, फिर आधा सेकेंड तक रोक देगा, और समाप्त होने तक वापस नहीं आएगा। एक तरह से जो IE8 में काम करता है। मैं निश्चित रूप से सर्वर पर कुछ पोस्ट नहीं करना चाहता हूं। ब्राउजर में बड़ी गणना सभी आधुनिक ब्राउज़रों में ठीक काम करती है। – Richard

संबंधित मुद्दे