2010-12-03 25 views
9

में एसिंक्रोनस फ़ंक्शंस को कैसे अवरुद्ध करें मुझे जावास्क्रिप्ट में एक फ़ंक्शन लिखने की आवश्यकता है, जो एक राज्य को एसिंक्रोनस फ़ंक्शन को कॉल करने से लौटाता है। हालांकि, कॉलर केवल मूल्य प्राप्त करता है और कोई कॉलबैक फ़ंक्शन प्रदान नहीं किया जाता है। मैं कुछ ऐसा करने की कोशिश की:जावास्क्रिप्ट

function getState() { 
    var ret = null; 
    asyncCall("request", 
     function() { ret = "foo"; } // callback 
    ); 
    while (ret === null) 
     ; // block on the asynchronous call 
    return ret; 
} 

हालांकि, पाश कभी नहीं समाप्त करने के लिए जा रहा है ...

कोई भी विचार? धन्यवाद।

+2

आप पहले स्थान पर एसिंक्रोनस कॉल को अवरुद्ध क्यों करना चाहते हैं? ऐसा करने से कोई मतलब नहीं आता है। – Tomalak

+1

@ टॉमोलक: क्योंकि यह फ़ायरफ़ॉक्स द्वारा प्रदान किया गया एक कॉल है और मैं इसे बदल नहीं सकता। यह अधिक मिलीसेकंड लेने की उम्मीद है, मैं इस वजह से अपने सभी अन्य कोड को दोबारा नहीं बदलना चाहता हूं। –

+0

क्या आप उस फ़ंक्शन को पोस्ट कर सकते हैं जो 'getState() 'कहता है? – Tomalak

उत्तर

8

मुझे लगता है कि आप StratifiedJS लिए देख रहे हैं, http://stratifiedjs.org यह आपको अपनी async कोड कि वास्तव में आप की तरह लिखा था "रच" करने के लिए, सावधान यह है कि अनुमति देता है तुल्यकालिक कोड की तरह "लिखता है" , यह आपके शेष एप्लिकेशन को अवरुद्ध नहीं करेगा। आप अपोलो जेएस लाइब्रेरी को लोड करके कहीं भी इसका उपयोग कर सकते हैं। http://onilabs.com/modules#http

function getState() { 
    return http.get("request"); 
} 
+0

हालांकि यह बाहरी पार्सर पर निर्भर करता है, यह यहां सबसे अच्छा समाधान प्रतीत होता है। –

+0

यह करता है। लेकिन भव्य योजना में यह ज्यादा उपर नहीं जोड़ता है। – tomg

0

क्यों नहीं बस:

asyncCall("request", function() { 
    // here you can inspect the state 
}); 

आवरण समारोह की बात क्या है?

असीमित कार्य इस तरह से काम करते हैं। आप निष्पादन ब्लॉक करने के लिए चाहते हैं, तो एक तुल्यकालिक कॉल का उपयोग करें:

var state = syncCall("request"); 
+0

यह लाइब्रेरी की तरह कुछ है क्योंकि मैं कई प्लेटफॉर्म पर काम कर रहा हूं। और शेष कोड को इस विशेष जानकारी के लिए प्रतीक्षा करने की आवश्यकता है। कोई तुल्यकालिक प्रतिस्थापन प्रदान नहीं किया जाता है। –

+0

@ryanli फिर कॉलबैक में शेष कोड डालें। –

+1

@ ime: तो क्या आपका मतलब एसिंक्रोनस कॉल अन्य सभी कोड को संक्रमित कर सकता है? मैं सिर्फ यह जानना चाहता हूं कि इन एसिंक कॉल पर अवरुद्ध करने का कोई तरीका है या नहीं। –

1

सबसे अच्छा तर्क आप कॉलबैक फ़ंक्शन में कहा जाता है चाहता हूँ डाल करने के लिए किया जाएगा। क्या कोई कारण है कि आप ऐसा क्यों नहीं कर सकते?

आप परिणाम पर जांच करने के setInterval इस्तेमाल कर सकते हैं, लेकिन यह एक कॉलबैक फ़ंक्शन भी आवश्यकता है ...

+0

मैं एक एक्सटेंशन लिख रहा हूं, सामान्य दस्तावेज़ जावास्क्रिप्ट नहीं। फ़ंक्शन का शेष भाग इस स्थिति पर निर्भर करता है, और प्रदान की जाने वाली एकमात्र चीज एक असीमित कार्य है। –

1

है कि आप क्या करने की कोशिश कर रहे हैं, एक तुल्यकालिक कॉल है इसलिए इसकी नहीं एक अच्छा विचार करने के लिए यह एसिंक्रोनस कॉल के लिए डिज़ाइन किए गए फ़ंक्शन के साथ है।

आपने एक उत्तर यहाँ है: How can I get jQuery to perform a synchronous, rather than asynchronous, Ajax request?

+0

मुझे इस बारे में पता है, हालांकि, यह एक एक्सएचआर अनुरोध नहीं है। –

1

जब तक मैं गलत समझा:

function getState() { 
    waitfor (var ret) { 
    // block on the asynchronous call 
    asyncCall("request", resume); 
    } 
    return ret; 
} 

निश्चित रूप से मॉड्यूल/पुस्तकालयों कि बस इसे इस तरह दिखना होगा हैं:

यह स्तरीकृत जावास्क्रिप्ट में कैसा दिखेगा कैसे है आपका प्रश्न, आप jQuery की AJAXStop() ईवेंट - http://api.jquery.com/ajaxstop देख सकते हैं। यह ब्लॉक जब तक सभी AJAX कॉल पूरा नहीं हो जाता है। यह स्पष्ट रूप से आवश्यक है कि आपके सभी एसिंक कॉल jQuery के माध्यम से किए जाएंगे।

$(document).ajaxStop(function() { 
    // do your "ajax dependent" stuff here 
}); 
संबंधित मुद्दे