मैं गणना अनुपात में आने से पहले डेटा को एन पंक्तियों में विभाजित करने के लिए कहूंगा। गणना अनुपात को एक ही समारोह यानी बनाओ। आपके प्रोग्राम // 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();
}
नोट: यह ध्यान देने योग्य है कि आप वादा पुस्तकालय अलग ढंग से की आवश्यकता होती है करना होगा, लेकिन मुझे लगता है कि आप पर निर्भर छोड़ दें।
मैं पढ़ रहा हूं http://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-asynchronous-call?rq=1 लेकिन मैं वास्तव में समझने के लिए संघर्ष कर रहा हूं कि कैसे इसे अपने मौजूदा कोड में अनुकूलित करने के लिए। मेरे पास 'combineData' के बाहर बहुत सारे सिंक्रोनस फ़ंक्शन हैं, क्या मुझे वास्तव में उन सभी को अतुल्यकालिक बनाने की आवश्यकता है? – Richard
क्या कोई तरीका है कि आप सर्वर पर गणना अनुपात करते हैं? – RadleyMith
http://stackoverflow.com/q/6864397/1048572, http://stackoverflow.com/q/714942/1048572 पर एक नज़र डालें। और हां, आपको एसिंक से निपटने के परिणामों के आधार पर जो कुछ भी निर्भर करता है उसे बदलने की आवश्यकता होगी। – Bergi