2014-06-11 18 views
31

मैं एक नोडजेएस फ्रेमवर्क से निपट रहा हूं जिसके लिए एक निश्चित फ़ंक्शन को सिंक्रोनस होना आवश्यक है, लेकिन मुझे उस मान को पुनर्प्राप्त करने की आवश्यकता है जिसे केवल अतुल्यकालिक रूप से एक्सेस किया जा सके। एक परिपूर्ण दुनिया में, मैं एक वादा वापस करने में सक्षम होगा, लेकिन मैं नहीं कर सकता।हल करने के लिए एक वादे का इंतजार कैसे करें?

एक त्वरित और गंदे समाधान के रूप में, मैं निम्न विधि बनाया:

exports.synchronizePromise = function(promise) { 
    var value; 
    promise.then(function(promiseValue) { 
     value = promiseValue; 
    }); 
    while (!value) {} // Wait for promise to resolve 
    console.log("DONE: " + value); // Never reached 
    return value; 
}; 

लेकिन मैं कोई त्रुटि मिलती है। क्या मुझे पूरा करने का कोई तरीका है?

+4

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

+2

@ दंडवीस मैंने फ्रेमवर्क को प्रतिबद्ध करने पर विचार किया है जिसका उपयोग मैं इसे बनाने के लिए कर रहा हूं ताकि फ़ंक्शन एसिंक हो, लेकिन इसे कई जगहों और 99% समय में बुलाया जाता है, इसे एसिंक द्वारा आवश्यकता नहीं होती है। यह वास्तव में अपस्ट्रीम को ठीक करने का विकल्प नहीं है। –

+0

आप प्रक्रिया को प्रेषित करने के तुरंत बाद एक guid वापस कर सकते हैं, और जब प्रक्रिया पूरी हो जाती है, तो अपने डेटा/डोम में ग्रिड ढूंढें और वास्तविक मान के लिए प्रतिस्थापित करें। – dandavis

उत्तर

2

क्यू में यदि आप एक समाधान हो वादा तुम सिर्फ मान ले सकता है के साथ निरीक्षण किया

exports.synchronizePromise = function(promise) { 
    var i = promise.inspect(); 
    if (i.state === "rejected") { 
     throw i.reason; 
    } else if (i.state === "fulfilled") { 
     return i.value; 
    } else { 
     throw new Error("attempt to synchronize pending promise") 
    } 
}; 

लेकिन अगर वादा लंबित है, यह वास्तव में अतुल्यकालिक है और अपने प्रश्न तो भावना और समारोह नहीं है एक त्रुटि फेंक देगा।

+0

धन्यवाद। मैं भूल गया कि नोडजेस एकल थ्रेडेड है, इसलिए मैंने सोचा कि मैं इसे हल होने तक बस इंतजार कर सकता हूं। –

+0

@ sinθ आप इसे हल होने तक प्रतीक्षा कर सकते हैं, यही वह है।'then' है, बस उस फ़ंक्शन कॉल को '.then' ब्लॉक के अंदर रखें। –

+0

हल किए गए वादे के मूल्य का निरीक्षण कैसे किया जाता है? –

-1

वादे असीमित हैं। वे भविष्य के मूल्य का प्रतिनिधित्व करते हैं - एक मूल्य 1ms, या 1 मिनट, या 1 दिन, या भविष्य में 1 वर्ष, या कभी भी उपलब्ध नहीं है। परिभाषा के अनुसार, समय मशीन के अलावा, उन्हें हल करने के लिए "मजबूर" करने का कोई तरीका नहीं है।

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

यदि आपके ढांचे को "एक निश्चित फ़ंक्शन को सिंक्रोनस होने की आवश्यकता होती है" जब वह फ़ंक्शन सिंक्रोनस नहीं होता है या नहीं, तो ढांचा खराब रूप से डिज़ाइन और अनुपयोगी होता है, या कम से कम आपकी समस्या के लिए उपयोग योग्य नहीं होता है।

+13

मान्य बिंदु के दौरान, यह वास्तविक प्रश्न के लिए स्पर्शिक है, जो वादे को हल करने के बारे में है। वादे को हल करने का एक मूल्य होता है जो इस विशेष उपयोग के मामले से आगे जाता है। – Siddhu

+0

@ सिद्धुवायरियर यह सुनिश्चित नहीं है कि आप क्या कहने की कोशिश कर रहे हैं। असल में, आप एक वादे को हल नहीं कर सकते; वादा स्वयं को हल करता है (या नहीं) और जो कुछ भी आप कर सकते हैं उसके होने का इंतजार है। या क्या मैं कुछ न कुछ भूल रहा हूं? "वादे को हल करने" से आपका क्या मतलब है? –

+0

जो मैं जिक्र कर रहा था वह एक तंत्र था जिससे आप संकल्प के लिए एसिंक्रोनस ऑपरेशन के परिणाम की प्रतीक्षा कर सकते हैं। उदाहरण के लिए, स्कैला में, ' वैल एफ = भविष्य {...}; f.map { आइटम => // भविष्य के परिणाम } के साथ कार्रवाई करें। पुनर्प्राप्ति { // हैंडल त्रुटियों }; Await.result (एफ, 10000 मिलीसेकंड); ' इस तरह के कुछ के लिए एक उपयोग का मामला यह है कि भविष्य के परिणामस्वरूप उत्पादन के लिए समानांतर में कई धागे निष्पादित कर सकते हैं, जबकि मुख्य धागा इसे खत्म करने की प्रतीक्षा करता है। – Siddhu

3

यह देखते हुए कि नोड डिफ़ॉल्ट रूप से केवल एक थ्रेडेड है, इसे हल करने का वास्तव में एक आसान तरीका नहीं है। हालांकि एक है। जनरेटर/फाइबर पर आधार आप नोड को समवर्ती निष्पादन का एक प्रकार जोड़ सकते हैं। उस पर आधारित waitfor implementation है।

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