2010-02-03 14 views
5

मेरे पास एक अजाक्स कॉल है जिसे वर्तमान में सिंक्रोनस होना चाहिए। हालांकि, जब यह अजाक्स कॉल निष्पादित हो रहा है, तब तक ब्राउज़र इंटरफ़ेस फ्रीज करता है, जब तक कि कॉल रिटर्न न हो जाए। टाइमआउट के मामलों में, यह ब्राउज़र को significant period of time के लिए फ्रीज कर सकता है।क्या जावास्क्रिप्ट लूप में अपडेट होने पर ब्राउज़र विंडो को अपडेट करना संभव है?

क्या उपयोगकर्ता इंटरफ़ेस को रीफ्रेश करने के लिए ब्राउज़र (कोई ब्राउज़र) प्राप्त करने का कोई तरीका है, लेकिन किसी भी जावास्क्रिप्ट को निष्पादित नहीं किया गया है? आदर्श रूप से यह window.update() जैसे कुछ कमांड होगा, जो उपयोगकर्ता इंटरफ़ेस थ्रेड रीफ्रेश करने देगा।

यदि यह संभव हो सकता है, तो मैं तुल्यकालिक AJAX कॉल की तरह कुछ के साथ बदलें सकता है:

obj = do_async_ajax_call(); 
while (!obj.hasReturned()) { 
    window.update(); 
} 
// synchronous call can resume 

कारण यह है कि मैं setTimeout उपयोग नहीं कर सकते, या कॉलबैक में एक समारोह को फिर से शुरू, वह यह है कि निष्पादन प्रवाह बाधित नहीं किया जा सकता: (अभी तक भी कई राज्य चर है कि सभी एक दूसरे पर निर्भर हैं, और long_function() प्रवाह अन्यथा किसी भी तरह फिर से शुरू करना होगा):

function long_function() { 
    // lots of code, reads/writes variable 'a', 'b', ... 
    if (sync_call_is_true()) { 
    // lots of code, reads/writes variable 'a', 'b', ... 
    } else { 
    // lots of code, reads/writes variable 'a', 'b', ... 
    } 
    // lots of code, reads/writes variable 'a', 'b', ... 
    return calculated_value; 
} 
+2

कॉल को तुल्यकालिक क्यों होना चाहिए? –

+1

क्या आप संपूर्ण कॉल कोड पोस्ट कर सकते हैं? यह संभवतः सरल हो सकता है और आपको जो चाहिए उसे समर्थन देने के लिए एक्सएचआर फ़ंक्शंस का उपयोग करें (जब तक कि jQuery एक विकल्प न हो, फिर भी क्लीनर)। यदि न तो कोई विकल्प है, तो मैं अनुरोध करता हूं कि आप 'do_sync_jax_call();' –

उत्तर

3

आप एक साथ अपने तुल्यकालिक अनुरोध को बदलने के लिए की जरूरत है एसिंक्रोनस अनुरोध और कॉलबैक का उपयोग करें। एक oversimplified उदाहरण होगा:

obj = do_async_ajax_call(function (data, success) 
{ 
    if (success) 
    { 
     // continue... 
    } 
}); 

function do_async_ajax_call(callback) 
{ 
    var xhr = new XMLHttpRequest(); 
    xhr.open("GET", "http://mysite.com", true); 
    xhr.onreadystatechange = function() 
    { 
     if (xhr.readyState == 4 && xhr.status == 200) 
      callback(xhr.responseXML, true); 
     else if (xhr.readyState == 4) 
      callback(null, false); 
    } 
    xhr.send(); 
} 

इस तरह आप ajax का अनुरोध कार्य करने के लिए एक पैरामीटर के रूप एक गुमनाम समारोह गुजर रहे हैं। जब AJAX पूरा हो जाता है, तो पारित किया गया फ़ंक्शन इसे प्रतिसाद देने वाले प्रतिक्रिया xML के साथ बुलाया जाता है। इस बीच, जब तक कॉल पूरा नहीं हो जाता तब तक ब्राउज़र सामान्य बात करने के लिए स्वतंत्र होता है। यहां से, आपका शेष कोड जारी है।

+0

पर फ़ंक्शन का नाम बदलें, यह सामान्य रूप से पर्याप्त होगा, लेकिन मैं ऑपरेशन प्रवाह को विभाजित नहीं कर सकता (जैसा कि प्रश्न में अपडेट किया गया है)। मैं अब एक और दृष्टिकोण की कोशिश कर रहा हूं ... – jevon

+0

यह * हमेशा * इसे विभाजित करने के लिए संभव है; यह सीपीएस ट्रांसफॉर्म है ("निरंतरता-गुजरने वाली शैली" देखें; निरंतरता पैरामीटर आपका कॉलबैक है)। कॉलबैक फ़ंक्शन में आपके स्थानीय राज्य चर बस बंद हो जाते हैं। लूप्स रिकर्सिव कॉल बन जाते हैं। एक बार जब आप इसे लटका लेंगे तो यह मुश्किल या अस्पष्ट नहीं है। –

+0

मैं मानता हूं कि यह हमेशा संभव है, लेकिन इस मामले में यह सबसे अच्छा समाधान नहीं था (बहुत सारे राज्य चर थे!) :) अंत में, मैंने क्लाइंट को अपडेट करने के लिए पिछले कॉलबैक (या नियमित सर्वर मतदान) के परिणाम का उपयोग किया आवश्यक होने पर सिंक्रोनस कॉल के कैश किए गए मान के साथ-साथ, इसलिए इसे अजाक्स को कॉल करने की आवश्यकता नहीं है। – jevon

0

कॉल के शेष समय ले लो और इसे रखा कॉलबैक में जब परिणाम वापस आता है कहा जाता है। मुझे गंभीरता से संदेह है कि यह आपके लिए पूरी तरह असंभव होगा। किसी भी तर्क आप कॉल में डाल करने की आवश्यकता है कॉलबैक में दोहराया जा सकता है

0

अतुल्यकालिक ajax setTimeout तो लाए जाने और मात्रा में प्रसंस्करण काम (कॉलबैक से शुरू हो रहा)

0

जावास्क्रिप्ट एकल-धागा है। तो परिभाषा के अनुसार, आप एक ज्वार लूप में रहते हुए यूआई अपडेट नहीं कर सकते हैं। हालांकि, फ़ायरफ़ॉक्स 3.5 से शुरू होने से बहु-थ्रेडेड जावाकैम के लिए वेब वर्कर्स नामक समर्थन जोड़ा गया है। वेब कर्मचारी पृष्ठ के यूआई को प्रभावित नहीं कर सकते हैं, लेकिन वे यूआई के अपडेट को अवरुद्ध नहीं करेंगे। हम कर्मचारियों को क्रोम और सफारी द्वारा भी समर्थित हैं।
समस्या यह है कि यदि आप अपने AJAX कॉल को पृष्ठभूमि थ्रेड में ले जाते हैं और इसे पूरा करने के लिए निष्पादन की प्रतीक्षा करते हैं, तो उपयोगकर्ता आपके यूआई पर बटन दबाकर मूल्य बदल सकते हैं (और जहां तक ​​मैं समझता हूं, वही है जो आप हैं से बचने की कोशिश कर रहा है)। उपयोगकर्ताओं को किसी भी बदलाव के कारण रोकने के लिए केवल एक चीज है जो एक स्पिनर है जो पूरे यूआई को अवरुद्ध कर देगी और वेब-कॉल रिटर्न तक पेज के साथ किसी भी बातचीत की अनुमति नहीं देगी।

+0

मुझे कोई फर्क नहीं पड़ता कि उपयोगकर्ता पृष्ठ से बातचीत करते हैं (और बातचीत कतारबद्ध है); लेकिन वर्तमान में, जबकि एक सिंक्रोनस अजाक्स कॉल फ़ायरफ़ॉक्स में निष्पादित हो रहा है, तो संपूर्ण ब्राउज़र फ्रीज हो जाता है। यही वह है जिसे मैं रोकना चाहता हूं। – jevon

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