2012-10-11 12 views
5

मेरे पास कई एएसपी.NET अपडेटपैनल्स हैं, प्रत्येक एक AsyncPostBackTrigger के साथ एक ही बटन के सर्वरसाइड क्लिक ईवेंट से जुड़ा हुआ है। चूंकि एक ही अपडेटपेनल एक समय में अपनी बात कर रहा है, इसलिए के का उपयोग करता है ताकि उपयोगकर्ता को पृष्ठ के किसी अन्य भाग तक पहुंचने में सक्षम होने से रोकने के लिए एसिंक पोस्टबैक पूरा हो जाए।जावास्क्रिप्ट: एक शर्त तक प्रतीक्षा करने के लिए गैर-अवरुद्ध तरीका

इस पृष्ठ के अन्य भाग को लगातार अद्यतन अपडेट पैनल अपडेट करने की आवश्यकता है। चूंकि अद्यतन पैनल एसिंक ट्रिगर्स का उपयोग करते हैं, इसलिए __doPostBack("<%=ButtonName.ClientID %>", 'PanelId'); कॉलिंग असुरक्षित रूप से आग लगती है। इस वजह से, यह लूप के अगले पुनरावृत्ति के साथ जल्दी से आगे बढ़ेगा और अगले पैनल को अपडेट करने का प्रयास करेगा। हालांकि, दूसरा पुनरावृत्ति विफल रहता है क्योंकि पहले से ही एक और अद्यतन पैनल एसिंक पोस्टबैक कर रहा है।

आदर्श रूप से, .get_isInAsyncPostBack() तक प्रतीक्षा करने का एक तरीका होगा अन्य क्लाइंट गतिविधि को अवरुद्ध किए बिना झूठी रिटर्न।

अनुसंधान ने मुझे अपनी समस्या के साथ बहुत से लोगों के लिए नेतृत्व किया है, जिनमें से लगभग setTimeOut() का उपयोग करने की सलाह दी जाती है। मुझे कोई बात नहीं है यह मेरे लिए काम करेगा। मैं फ़ंक्शन निष्पादित करने से पहले निर्दिष्ट समय के लिए प्रतीक्षा नहीं करना चाहता हूं। मैं बस अपनी जावास्क्रिप्ट प्रतीक्षा करना चाहता हूं जबकि एक और स्क्रिप्ट चल रही है, अधिमानतः एक विशिष्ट स्थिति सत्य होने तक प्रतीक्षा करें।

मैं समझता हूं कि कई शायद यह सुझाव देना चाहते हैं कि मैं अपने मॉडल पर पुनर्विचार करता हूं। यह वास्तव में मेरा मॉडल नहीं है, लेकिन एक जो हमारी विकास टीम को सौंप दिया गया था जो वर्तमान में हुड के नीचे कुल गड़बड़ है। समय की बाधाओं के कारण, मॉडल को फिर से लिखना एक विकल्प नहीं है। एकमात्र विकल्प यह काम करना है। मुझे लगता है कि अगर मेरे पास क्लाइंट कोड को अवरुद्ध किए बिना प्रतीक्षा करने का कोई तरीका था, तो मेरी समस्या हल हो जाएगी।

+0

यह बस जावास्क्रिप्ट काम नहीं करता है। यह समकालिक रूप से सभी कोड निष्पादित करेगा। एचटीएमएल 5 कूल नए [वेब वर्कर्स] (https://developer.mozilla.org/en-US/docs/DOM/Using_web_workers) मदद कर सकते हैं, लेकिन बाकी के लिए आपके पास 'setTimeout'/'setInterval का उपयोग करने के अलावा कोई विकल्प नहीं होगा '। – user2428118

+0

अच्छा सवाल। मैंने इसे दो बार लिखने की कोशिश की। – pylover

उत्तर

26

जावास्क्रिप्ट में प्रतीक्षा या नींद जैसी कोई कार्यक्षमता नहीं है, क्योंकि यह ब्राउज़र को प्रतिक्रिया देने से रोक देगा।

आपके मामले में मैं निम्न जैसा कुछ के साथ जाना होगा:

function wait(){ 
    if (!condition){ 
    setTimeout(wait,100); 
    } else { 
    // CODE GOES IN HERE 
    } 
} 
+1

मुझे यकीन नहीं है कि यह कैसे काम करना चाहिए। जब मैं इस कोड को 'setTimeout (function() {चेतावनी ("प्रतीक्षा") निष्पादित करता हूं;}, 5000); चेतावनी ("donewaiting"); '," donewaiting "पहले सतर्क किया जाता है, उसके बाद 5 सेकंड बाद" प्रतीक्षा "के बाद। प्रतीक्षा करने का क्या मतलब है अगर यह तुरंत कोड की अगली पंक्ति में स्थानांतरित करने जा रहा है? – oscilatingcretin

+2

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

+1

यह 'मतदान' तकनीक अनिवार्य रूप से '100 'तक' प्रतीक्षा 'कार्य चलाती है जब तक कि' स्थिति 'सच नहीं हो जाती '। आपके उद्देश्यों के लिए, मैं 'condition_isInAsyncPostBack()' और '... कोड यहां जा रहा है ... 'के साथ' स्थिति 'को प्रतिस्थापित करेगा, अगले पैनल को अपडेट करने के लिए कॉल के साथ, अगले पैनल के लिए' प्रतीक्षा 'के बाद । आप प्रत्येक पैनल के लिए एक नया 'प्रतीक्षा()' फ़ंक्शन चाहते हैं (उदाहरण के लिए, 'WaitForPanel1() ',' waitForPanel2() ', आदि –

11

यह जब setTimeout कि JavaScript कॉल स्टैक को भरने के लिए कारण होगा बुला एक गलती करते हैं आसान है।

function wait(param1, param2){ 
    if (!condition){ 
    setTimeout(wait, 100, param1, param2); 
    } else { 
    // CODE GOES IN HERE 
    } 
} 

आप पैरामीटर भेजने या यहां तक ​​कि खाली शामिल() फ़ंक्शन के नाम के बाद, तो यह हो जाएगा: अपने फ़ंक्शन पैरामीटर है, तो आप उन लोगों के इस तरह setTimeout पैरामीटर सूची के अंत में में पारित करने के लिए की जरूरत है तुरंत निष्पादित और ढेर भरें।

// This is the wrong way to do it!  
function wait(param1, param2){ 
    if (!condition){ 
    setTimeout(wait(param1, param2), 100); // you'll get max call stack error if you do this! 
    } else { 
    // CODE GOES IN HERE 
    } 
} 
2

यह फ़ंक्शन condFunc को कॉल करता है जो शर्त मिलने पर सत्य वापस आना चाहिए। जब ऐसा होता है तो फनक कहा जाता है। checkInterval मिलीसेकेंड

में जाँच दर सेट
 var wait = function(condFunc, readyFunc, checkInterval) { 
      var checkFunc = function() { 
       if(condFunc()) { 
        readyFunc(); 
       } 
       else 
       { 
        setTimeout(checkFunc, checkInterval); 
       } 
      }; 
      checkFunc(); 
     }; 

उपयोग:

 wait(
      function() { return new Date().getSeconds() == 10; }, 
      function() { console.log("Done"); }, 
      100 
     ); 

प्रिंट "हो गया" जब वर्तमान समय 10 सेकंड मिनट के बाद है

0

मैं एक प्रक्रिया को धीमा करने के लिए आवश्यक है और एक के साथ आया था सहायक छोटी विधि।

let wait = (seconds) => 
    new Promise(resolve => 
     setTimeout(() => resolve(), seconds * 1000) 
    ); 

और आप इसे इस तरह उपयोग कर सकते हैं।

(async() => { 
    await wait(3); //wait 3 seconds 
    let result = await doWork(); 
}) 
संबंधित मुद्दे