2015-04-03 14 views
5

मैं स्पष्ट रूप से जेएस वादे के हल या "वापसी" के अर्थशास्त्र के बारे में कुछ गलत समझ रहा हूं।जावास्क्रिप्ट वादे के लिए कैसे अवरुद्ध करें और हल किए गए परिणाम को वापस करें?

मुझे एक ऐसे फ़ंक्शन द्वारा बुलाया जा रहा है जो मुझे एक मान वापस करने के लिए सिंक्रोनस होने की अपेक्षा करता है। कि मूल्य की गणना कुछ एसिंक्रोनस कोड (विशेष रूप से, एक dstore Collection

पर foreach विधि मेरा लक्ष्य क्या है कोशिश कर रहा हूँ लगभग यह है की आवश्यकता है, लेकिन यह काम नहीं करता समारोह mySynchronousFunction कोई वापसी मूल्य है।

function mySynchronousFunction() { 
    var accumulator = {}; 
    var myPromise = doAsynchronousThingThatSideEffectsAccumulator(); 
    // Now my caller is expecting the value of accumulator. 
    myPromise.then(function() {return accumulator;}) 
} 

मैं समझता हूँ कि जे एस इतना है कि यह ब्लॉक करने के लिए शांत नहीं कर रहा है, लेकिन तुल्यकालिक कोड को अतुल्यकालिक चिपकाने के लिए कुछ पैटर्न होना चाहिए, एकल पिरोया कार्यान्वयन के लिए अनुमति देने के लिए, कि मैं बस नहीं छूटा है है।

+0

यह एकल-थ्रेडेड कार्यान्वयन के लिए अनुमति देने के बारे में नहीं है - ** सभी ** कार्यान्वयन आवश्यक रूप से सिंगल-थ्रेडेड हैं। – meagar

+0

@ मीगर जो सच नहीं है - कुछ भी नहीं कहता है कि सभी कार्यान्वयन एकल धागे हैं - उदाहरण के लिए जावा में राइनो। –

+1

कोई उत्तर नहीं जोड़ सकता है, लेकिन यह मेरे लिए सहायक था: http://www.tivix.com/blog/making-promises-in-a-synchronous-manner/ – rainabba

उत्तर

5

आप नहीं कर सकते हैं एक एसिंक्रोनस ऑपरेटिंग से एक तुल्यकालिक परिणाम बनाओ जावास्क्रिप्ट में एन। आप बस यह नहीं कर सकते। यदि आपके ऑपरेशन का कोई भी हिस्सा एसिंक है, तो पूरा परिणाम एसिंक होना चाहिए और ऑपरेशन पूरा होने पर आपको कॉलबैक, वादा या कुछ अन्य तंत्र का उपयोग करना होगा और परिणाम तैयार हो जाएगा।

अपने async आपरेशन पहले से ही एक वादा (यह की तरह लग रहा है), तो आप सिर्फ लौटना चाहिए कि आवरण समारोह से वापस लौटता है तो:

function myWrapperFunction() { 
    var accumulator = {}; 
    var myPromise = doAsynchronousThingThatSideEffectsAccumulator(accumulator); 
    // Now my caller is expecting the value of accumulator. 
    return myPromise.then(function(result) { 
     // operate on the accumulator object using the async result 
     return accumulator; 
    }) 
} 

myWrapperFunction.then(function(accumulator) { 
    // write your code here that uses the accumulator result 
}); 

तुम भी नोट करने के लिए चाहते हो सकता है कि एक समारोह है कि पक्ष के माध्यम से संचालित प्रभाव शायद ही कभी सबसे अच्छा डिजाइन पैटर्न है। आप इनपुट में भी पास हो सकते हैं और इसे हल किए गए वादे के माध्यम से आउटपुट वापस कर सकते हैं और साइड इफेक्ट्स से पूरी तरह से बच सकते हैं।

3

नहीं, एसिंक्रोनस कोड सिंक्रोनस बनाने का कोई तरीका नहीं है। एक बार जब आप एसिंक्रोनस कॉल कर लेते हैं, तो आपको परिणाम को असीमित तरीके से संभालना होगा।

जावास्क्रिप्ट एकल थ्रेडेड है, इसलिए यदि आप परिणाम के लिए इंतजार कर रहे अवरोधक लूप बनाते हैं, तो परिणाम की देखभाल करने वाला कोड चलाने का मौका नहीं होगा।

यदि आप किसी एसिंक्रोनस फ़ंक्शन से कुछ वापस करना चाहते हैं, तो आपको एक वादा वापस करना होगा कि कॉलिंग कोड असीमित रूप से परिणाम को संभालने के लिए उपयोग कर सकता है।

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