2009-07-10 18 views
14

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

यह अजाक्सपर्टर्न साइट से HTTP Streaming (current संस्करण) पैटर्न फिट लगता है।

प्रश्न यह है कि क्रॉस-ब्राउज़र (ब्राउज़र अज्ञेयवादी) तरीके से इसे कैसे करें, अधिमानतः जावास्क्रिप्ट ढांचे का उपयोग किए बिना, या jQuery जैसे कुछ हल्के ढांचे का उपयोग करना।

समस्या क्रॉस-ब्राउज़र फैशन में XMLHttpRequest उत्पन्न करने के साथ शुरू होती है, लेकिन मुझे लगता है कि मुख्य आइटम यह है कि सभी ब्राउज़र सही ढंग से लागू नहीं होते onreadystatechangeXMLHttpRequest से; प्रत्येक ब्राउजर पर onreadystatechange ईवेंट प्रत्येक सर्वर फ्लश पर नहीं है (बीटीडब्ल्यू। सीजीआई स्क्रिप्ट (पर्ल में) से सर्वर फ्लश को कैसे मजबूर करना है?)। अजैक्सपर्टर्न पर उदाहरण कोड टाइमर का उपयोग करके इसके साथ सौदा करता है; अगर मुझे onreadystatechange से आंशिक प्रतिक्रिया का पता लगाना है तो क्या मुझे टाइमर समाधान छोड़ना चाहिए?


जोड़ा 11-08-2009

वर्तमान समाधान:
मैं निम्नलिखित समारोह का उपयोग XMLHttpRequest वस्तु बनाने के लिए:

function createRequestObject() { 
     var ro; 
     if (window.XMLHttpRequest) { 
       ro = new XMLHttpRequest(); 
     } else { 
       ro = new ActiveXObject("Microsoft.XMLHTTP"); 
     } 
     if (!ro) 
       debug("Couldn't start XMLHttpRequest object"); 
     return ro; 
} 

अगर मैं उपयोग करने के लिए थे कुछ (अधिमानतः हल्के वजन) jQuery की तरह जावास्क्रिप्ट ढांचे, मैं उपयोगकर्ता अगर फॉलबैक करना चाहते हैं jQuery स्थापित करने के लिए चुनता है।

मैं AJAX शुरू करने के लिए निम्न कोड का उपयोग करता हूं; setInterval का उपयोग किया जाता है क्योंकि कुछ ब्राउज़र सर्वर को कनेक्शन बंद करने के बाद onreadystatechange पर कॉल करते हैं (जो सेकंड के दस मिनट तक ले सकता है), और जैसे ही सर्वर डेटा फ्लश करता है (हर दूसरे या अधिक बार)।

function startProcess(dataUrl) { 
     http = createRequestObject(); 
     http.open('get', dataUrl); 
     http.onreadystatechange = handleResponse; 
     http.send(null); 

     pollTimer = setInterval(handleResponse, 1000); 
} 

handleResponse समारोह सबसे जटिल से एक है, लेकिन इसके बारे में संक्षिप्त वर्णन निम्नलिखित की तरह दिखता है। क्या यह बेहतर किया जा सकता है? कुछ हल्के जावास्क्रिप्ट ढांचे (जैसे jQuery) का उपयोग करके यह कैसे किया जाएगा?

function handleResponse() { 
    if (http.readyState != 4 && http.readyState != 3) 
     return; 
    if (http.readyState == 3 && http.status != 200) 
     return; 
    if (http.readyState == 4 && http.status != 200) { 
     clearInterval(pollTimer); 
     inProgress = false; 
    } 
    // In konqueror http.responseText is sometimes null here... 
    if (http.responseText === null) 
     return; 

    while (prevDataLength != http.responseText.length) { 
     if (http.readyState == 4 && prevDataLength == http.responseText.length) 
      break; 
     prevDataLength = http.responseText.length; 
     var response = http.responseText.substring(nextLine); 
     var lines = response.split('\n'); 
     nextLine = nextLine + response.lastIndexOf('\n') + 1; 
     if (response[response.length-1] != '\n') 
      lines.pop(); 

     for (var i = 0; i < lines.length; i++) { 
      // ... 
     } 
    } 

    if (http.readyState == 4 && prevDataLength == http.responseText.length) 
     clearInterval(pollTimer); 

    inProgress = false; 
} 
+0

आपको निश्चित रूप से उस कोड उदाहरण को उत्तर के रूप में जोड़ना चाहिए और इसे सही के रूप में चिह्नित करना चाहिए! –

+4

"यदि उपयोगकर्ता jQuery स्थापित नहीं करना चुनता है"? – Basic

+0

हाय, बस आपके समाधान में आया, लेकिन मुझे डर है कि यह अभी भी आईई के साथ काम नहीं करेगा, क्योंकि जब आप प्रतिक्रिया प्राप्त करने का प्रयास करेंगे तब अनुरोध अभी भी समाप्त नहीं हुआ था, तो आपको निम्नलिखित मिलेंगे संदेश: "इस ऑपरेशन को पूरा करने के लिए आवश्यक डेटा अभी तक उपलब्ध नहीं है"। –

उत्तर

2

आपके द्वारा लिंक किया गया समाधान वास्तव में AJAX नहीं है। वे इसे HTTP स्ट्रीमिंग कहते हैं लेकिन यह अनिवार्य रूप से केवल लंबे मतदान है।

उदाहरण में वे लिंक करते हैं, आप फायरबग के साथ अपने आप को आसानी से देख सकते हैं। नेट पैनल चालू करें - कोई एक्सएचआर प्रविष्टियां नहीं हैं, लेकिन मूल पृष्ठ को लोड करने में 10 सेकंड से अधिक बाल लगते हैं। ऐसा इसलिए है क्योंकि वे HTML के आउटपुट में देरी के लिए दृश्यों के पीछे PHP का उपयोग कर रहे हैं। यह लंबे मतदान का सार है - HTTP कनेक्शन खुला रहता है, और आवधिक HTML वापस भेजा जावास्क्रिप्ट कमांड है।

आप मतदान पूरी तरह से क्लाइंट की तरफ, setTimeout() या setInterval()

के साथ एक jQuery उदाहरण

<script type="text/javascript"> 
    $(document).ready(function() 
    { 
    var ajaxInterval = setInterval(function() 
    { 
     $.getJSON(
     'some/servie/url.ext' 
     , { sample: "data" } 
     , function(response) 
      { 
      $('#output').append(response.whatever);   
      } 
    ); 
    }, 10000); 
    }); 
</script> 
+0

जो भी मैं चाहता हूं वह बिल्कुल नहीं है। सर्वर पर गणना सादा पाठ प्रारूप में आउटपुट उत्पन्न करता है। एक्सएचआर के साथ मैं इस प्रतिक्रिया को क्लाइंट में सीधे प्राप्त कर सकता हूं (फ़्लश/टाइमर पर पहले से ही एक्सचेंज) और आंशिक डेटा के अनुसार वेब पेज संपादित करें। –

+0

आप क्या चाहते हैं? लंबे मतदान? मैं किसी भी विधि की सिफारिश नहीं कर रहा हूं - मैं आपको बता रहा हूं कि आपके विकल्प क्या हैं। –

+0

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

0

ऐसा करने के लिए, हालांकि विकल्प चुन सकते हैं मैं परिक्रमा

पर एक नज़र ले जाएगा

वे कॉन्फ़िगरेशन और ब्राउज़र स्नीफिंग के आधार पर चुनने वाले कई धूमकेतु परिवहन कार्यान्वयन का उपयोग करते हैं।

http://orbited.org/svn/orbited/trunk/daemon/orbited/static/Orbited.js

देखें और "Orbited.CometTransports"

विभिन्न परिवहन के कुछ बैकएंड कार्यान्वयन से मेल खाना आवश्यक के लिए करते हैं, इसलिए भी परिक्रमा के लिए सर्वर साइड पर एक नजर है।