2010-05-04 12 views
6

मेरे पास एक कॉलबैक के साथ getJSON का उपयोग करके एक क्रॉस-डोमेन लंबे मतदान अनुरोध है जो इस तरह कुछ दिखता है:पुराने जेसनपी अनुरोध को कैसे मारें?

$.getJSON("http://long-polling.com/some.fcgi?jsoncallback=?" 
    function(data){ 
      if(data.items[0].rval == 1) { 
      // update data in page 
      } 
    }); 

समस्या यह है कि लंबी-मतदान सेवा के अनुरोध में वापसी करने में कुछ समय लग सकता है, और दूसरा getJSON अनुरोध इस दौरान बनाया जा सकता है और पृष्ठ को अद्यतन कर सकता है भले ही यह एक पुरानी प्रतिक्रिया है।

Req1: h ** p: //long-polling.com/some.fcgi 10:00 पूर्वाह्न

Req2: h ** p: //long-polling.com /some.fcgi? 10:01 पूर्वाह्न

Req1 पर डेटा लौटाता है और अद्यतन करता है पृष्ठ 10:02 पूर्वाह्न

मैं Req2 से रिटर्न को अमान्य करने का एक तरीका चाहता हूं यदि Req2 पहले ही हो चुका है।

धन्यवाद!

उत्तर

5

जब आप AJAX अनुरोध करते हैं तो यह XMLHttpRequest ऑब्जेक्ट देता है। यदि आप abort कॉल करना चाहते हैं तो आप उस पर .abort() विधि को कॉल कर सकते हैं।

var request = $.getJSON(. . . . .); 
request.abort(); 
+0

+1। बस एक ही जवाब देने वाला था। – Boldewyn

+7

JSONP XMLHttpRequest का उपयोग नहीं करता है, यह पृष्ठ में एक HTML

7

मुझे नहीं लगता कि getJSON रूप में काम करता है JSONP विधि है जो वास्तव में गतिशील रूप से एक स्क्रिप्ट टैग जो आपके ब्राउज़र कार्यान्वित डालने से काम करता है का उपयोग करता है। मुझे नहीं लगता कि ब्राउजर को स्क्रिप्ट को निष्पादित करने से रोकने का कोई तरीका है ... क्या वहां है?

+0

सहमत; अधिक जानकारी के लिए यह प्रश्न देखें, http://stackoverflow.com/questions/4162261/i-cannot-stop-an-ajax-request-using-jquery-and-abort- कार्यक्षमता – goggin13

1

जैसा कि @NewToDB का उल्लेख है, आप jsonp अनुरोध को रद्द नहीं कर सकते हैं (उदा। ब्राउज़र को टैग के स्रोत को लोड करने का प्रयास रोकने के लिए ब्राउज़र को बताएं), लेकिन आप एक ऐसी प्रणाली को कार्यान्वित कर सकते हैं जो पुराने कॉल के लौटे डेटा को प्रभावी रूप से अनदेखा कर सके। एक ग्लोबल वैरिएबल को परिभाषित करें जो प्रत्येक बार जेएसपीपी कॉल करने जा रहा है और उस चर के मान को पैरामीटर के रूप में सर्वर पर पास कर देगा। आपको इसे सर्वर से काउंटर बैक पास करने की भी आवश्यकता है (मुझे लगता है कि आप सर्वर कोड भी रखते हैं)। यदि आपके काउंटर का वर्तमान मान लौटाए गए काउंटर वैल्यू के बराबर नहीं है तो आप जानते हैं कि एक और सर्वर कॉल पहले ही कर दिया गया है, ताकि आप लौटाए गए डेटा को अनदेखा कर सकें।

// Global counter 
var callCounter = 0; 

...

$.getJSON("http://long-polling.com/some.fcgi?callCounter=" + (++callCounter) + "&jsoncallback=?" 
    function(data){ 
      if(data.items[0].rval == 1 && data.callCounter == callCounter) { 
      // update data in page 
      } 
    }); 
0

मैं ऐसे कार्य के लिए वैश्विक चर का उपयोग करें। यह एक बहुत अच्छा तरीका नहीं है, लेकिन सबसे सरल है।

if (typeof(myFooRequest) == 'object') { 
    myFooRequest.abort(); 
    myFooRequest = false; 
} 
myFooRequest = $.get("/url", function(data) { 
    // ... 
}); 
संबंधित मुद्दे