प्रोटोटाइप Ajax.PeriodicalUpdater रिक्त स्ट्रिंग सम्मिलित करता है जब सर्वर पहुँच योग्य नहीं

वोट
2

मैं कुछ अपडेट किया हुआ HTML हड़पने और आईडी सामग्री के साथ एक div में डालने के लिए निम्नलिखित का उपयोग कर रहा

var updater = new Ajax.PeriodicalUpdater('content', '/Doc?'+d.getTime(),
  {
    method: 'post',
    frequency: 5,
  });

समस्या यह है कि जब सर्वर बंद हो जाता है (यह एक ऐप्लिकेशन है जो संशोधित कर रहा है और सर्वर डेटा के अंदर चल रहा है), अपडेटर तो बस बाहर सामग्री div को साफ करता है है।

वहाँ तो यह है जब PeriodicalUpdater का समय समाप्त, एक 404 हो जाता है, आदि यह सिर्फ सामग्री में कोई बदलाव छोड़ देता है कि के लिए एक रास्ता है? मैं नहीं बल्कि यह है कि अंतिम रूप से उपलब्ध डेटा बस वहाँ रहना, मिटाया नहीं किया जाएगा।


पूर्णता के लिए, यह अपने पूरे कोड है:

<html>
<head>
<title></title>
<script type=text/javascript src=/Prototype></script>
<script type=text/javascript>
var css;
var css_data;

function load_content()
{
  var d = new Date();

  css = document.createElement('style');
  css.setAttribute('type', 'text/css');
  if(css.styleSheet) { css.styleSheet.cssText = '';} //Because IE is evil
  else { css_data = document.createTextNode(''); css.appendChild(css_data); } //And everyone else is cool
  document.getElementsByTagName(head)[0].appendChild(css);

  var updater = new Ajax.PeriodicalUpdater({success: 'content'}, '/%doc_path%?'+d.getTime(),
  {
    method: 'post',
    frequency: 5,
    onSuccess: function(transport) {
          new Ajax.Request('/%css_path%?'+d.getTime(), {
              method: 'post',
              onSuccess: function(transport) {
                if(css.styleSheet) { css.styleSheet.cssText = transport.responseText}
                else { 
                    var new_css_data = document.createTextNode(transport.responseText);
                    css.replaceChild(new_css_data, css_data); 
                    css_data = new_css_data;
                } 
              }
          });
          new Ajax.Request('/%title_path%?'+d.getTime(), {
              method: 'post',
              onSuccess: function(transport) {
                document.title = transport.responseText;
              }
          });
    }
  });
}

</script>

</head>

<body>
<div id=content></div>

<script type=text/javascript>
    load_content();
</script>

</body>
</html>

आप देख सकते हैं, मैं त्रिफलक समाधान नहीं जाने की कोशिश की ... लेकिन अभी भी। जब अनुरोध अभी भी विफल यह खाली डेटा के साथ अद्यतन करता है। जब से मैं पूरी बात यहाँ मिल गया है अब, किसी को भी कोई गलती मैं बना रहा हूं देख सकते हैं।

नोट: की तरह तार पर ध्यान न दें% doc_path% ... उन बस को नियंत्रित तार मैं इतना है कि वे बाद में हो सकता है प्रत्येक दस्तावेज़ के लिए उचित पथ के साथ प्रोग्राम के रूप में बदल देता है का उपयोग करें ... सब सामान है कि सर्वर पर किया है और वास्तव में कोई फर्क नहीं पड़ता हैं इसके लिए।


@Vinze

प्रलेखन के अनुसार, onFailure लागू जब एक अनुरोध के पूरे होने और उसकी स्थिति कोड मौजूद है, लेकिन 2xy परिवार में नहीं है। अगर एक कोड-विशिष्ट कॉलबैक परिभाषित किया गया है इस को छोड़ दिया जाता है, और onComplete से पहले होता है। है

लेकिन अगर सर्वर बंद कर दिया गया था, यह सिर्फ समय समाप्त नहीं होता और कोई स्थिति कोड बिल्कुल हो सकता है? हो सकता है कि मुझे लगता है कि गलत समझ रहा हूँ ...

13/01/2009 को 16:08
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


4 जवाब

वोट
1

के रूप में Ajax.PeriodicalUpdater Ajax.Request के गुणों को विरासत में आप विकल्प की सूची में एक onFailure विकल्प जोड़ सकते हैं ( http://www.prototypejs.org/api/ajax/request )

विपरीत में आप "onComplete" के उपयोग या "अनुरोध जीवन चक्र" के किसी भी नीचे दिए गए लिंक में में अधिक रुचि हो सकती

13/01/2009 को 16:12
का स्रोत उपयोगकर्ता

वोट
0

कैसे अपने आप को द्वारा यह सब करने के बारे में?

एक समारोह है कि अद्यतन फोन करेगा से शुरू करें:

function requestMoreInfo(){
new Ajax.Request('url',
  {
    method:'get',
    parameters:  "someget=here",
    onSuccess: handleTheReturn
  });

}

फिर एक समारोह है कि सर्वर से जवाब संभाल लेंगे बनाने के लिए:

function handleTheReturn(reply){
    var newMessages = eval('(' + reply.responseText + ')');
    //update your element or whatever
} 

और फिर साथ यह हर 20 (या जो भी) सेकंड चलाएँ:

new PeriodicalExecuter(requestMoreInfo, 20);

तो बस अपने ऑनलोड कार्य करने के लिए पहली बार एक requestMoreInfo जोड़ सकते हैं और अपने अच्छे जाने के लिए ... अब आपकी समस्या का समाधान करने के लिए, बस handleTheReturn समारोह में newMessages वर को मान्य और आप कुछ भी आप चाहते हैं (सर्वर एक JSON ऑब्जेक्ट भेजने पता करने के लिए बनाने के लिए कर सकते हैं ठीक है, या कुछ अन्य कोड हो सकता है, या आप बचना चाहते हैं विशिष्ट त्रुटियों के लिए खोज!

13/01/2009 को 16:28
का स्रोत उपयोगकर्ता

वोट
1

एक वस्तु (नहीं एक स्ट्रिंग) PeriodicalUpdater को पहले पैरामीटर के रूप गुजरती हैं। 'सफलता' के रूप में keyed मूल्य केवल सफल AJAX कॉल पर बुलाया जाएगा।

new Ajax.PeriodicalUpdater({success: 'content'}, '/Doc?'+d.getTime(),
  {
    method: 'post',
    frequency: 5,
  });

Ajax.Updater पर अधिक (जिसमें से PeriodicalUpdater विरासत)

13/01/2009 को 16:30
का स्रोत उपयोगकर्ता

वोट
0

इस पर अधिक जानकारी।

Ajax.PeriodicalUpdater करता नहीं Ajax.Updater से विरासत, के रूप में विस्तार से बताया http://www.prototypejs.org/api/ajax/periodicalupdater :

Ajax.PeriodicalUpdater Ajax.Updater की एक विशेषज्ञता, इसका नाम के बावजूद नहीं है।

यह Ajax.Updater को अग्रेषित वैकल्पिक पैरामीटर (अपने आप में एक वर्ग है कि Ajax.Request से विरासत) है, जो मतलब है कि यह एक Ajax.Request instantiating और इसे करने के लिए कॉलबैक गुजर के बराबर है प्रतीत होता है करता है।

मैं परीक्षण किया है और इस बात की पुष्टि कर सकते हैं कि एक onFailure समारोह जोड़ने करता नहीं इस मामले में काम करते हैं। न ही onException जोड़ने है।

दोनों, काम करने के लिए उम्मीद किया जा सकता था, क्योंकि वे Ajax.Updater वस्तु Ajax.PeriodicalUpdater द्वारा instantiated के लिए पारित कर रहे हैं। हालांकि, कुछ डिबगिंग के बाद, ऐसा लगता है कि Ajax.Updater कभी नहीं एक अपवाद या विफलता के रूप में एक अनुपलब्ध सर्वर समझता है। यही कारण है, सफलता के लिए कंटेनर हमेशा अद्यतन किया जाता है, तब भी जब {: 'सामग्री', विफलता: 'failureContent' सफलता} के रूप में परिभाषित है (अच्छी तरह से, इस मामले में, खाली कर दिया),।

इसके अलावा, मेरे परीक्षण के अनुसार, Ajax.Updater (और Ajax.PeriodicalUpdater) न onSuccess () और न ही onComplete () जब सर्वर जवाब नहीं है कहते हैं।

वास्तव में, केवल कॉलबैक मैं पाने में कामयाब रहे इस प्रकार, on0 है:

new Ajax.PeriodicalUpdater('content', 'url', {
    frequency: 5,
    on0: function(requester, exception) {
        alert("ERROR 0");
    }
});

ऐसा लगता है कि 0 Ajax.Request के लिए त्रुटि कोड (Ajax.Updater के लिए माता-पिता वर्ग) जब सर्वर पहुंच योग्य नहीं है।

बुरी खबर यह है कि on0 () कहा जाता है से पहले सामग्री को अपडेट / खाली कर दिया है, जिसका अर्थ है कि यह एक कस्टम एक साथ उस सामग्री को बदलने के लिए असंभव है।

जहाँ तक मेरा बता सकते हैं, में सर्वर के मामले पहुँच योग्य नहीं किया जा रहा है, सब पर कोई वैकल्पिक कॉलबैक सामग्री अद्यतन किया जाता है के बाद कहा जाता है।

यह दोनों Ajax.PeriodicalUpdater और Ajax.Updater लिए सच है। जिसका अर्थ है कि एक ही रास्ता मैं वांछित व्यवहार प्राप्त करने के लिए देखने के सीधे Ajax.Request उपयोग करने के लिए है।

14/01/2011 को 11:55
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more