2013-03-09 9 views
7

मैं jQuery के साथ jsonp का उपयोग करने की कोशिश कर रहा हूं लेकिन मुझे असंगत व्यवहार मिलते हैं। कभी-कभी स्क्रिप्ट काम करता है, कभी-कभी ऐसा नहीं होता है; मैं वास्तव में क्यों नहीं समझता।jsonp असंगत त्रुटि: ऑब्जेक्ट फ़ंक्शन नहीं है

यह त्रुटि है कि क्रोम द्वारा प्रदर्शित किया जा सकता है:

Uncaught TypeError: Property 'jQuery18208278296771459281_1362854738133' of object [object Object] is not a function 

निम्न उदाहरण में, मैं केवल कि क्या आवेदन ऑनलाइन है या नहीं की जाँच करने की कोशिश कर रहा हूँ। लेकिन इस असंगत व्यवहार अन्य इसी तरह के ajax कॉल पर हो सकता है:

 $.ajaxSetup({ 
     error: function (req, status, ex) {}, 
     success: function (data, status, req) {}, 
     timeout: 2000, 
     crossDomain: true, 
     contentType: "application/json", 
     dataType:"jsonp", 
     url: "http://myUrl.com/ping.php?preventCache="+new Date() 
    }); 
    return $.ajax(); 

सर्वर साइड PHP फ़ाइल भी बहुत सरल है: अपनी स्क्रिप्ट एक से अधिक बार में एक समान AJAX अनुरोध कर रही है

<?php 
header("Content-Type: application/javascript; charset=UTF-8"); 
echo $_GET['callback']; 
?> ({ "status": "online" }) 

उत्तर

5

आपका प्रश्न इतना स्पष्ट नहीं है, मुझे उसी कॉलबैक फ़ंक्शन नाम का दो बार उपयोग करने का प्रयास करने पर एक ही त्रुटि मिल रही थी। किसी भी मामले में यह कैसे jsonp jQuery में बुलाया जाना चाहिए है:

 var mycallback = 'c'+Math.floor((Math.random()*100000000)+1); 
     $.ajax({ 
        type: 'GET', 
        url: URL, 
        async: true, 
        jsonpCallback: mycallback, 
        contentType: "application/json", 
        dataType: 'jsonp' 

     }).done(function(json){ 
      console.log(json); 
        callback(json); 
     }).fail(function(f){ 
      console.log("f"); 
        console.log(f.status); 
     }).always(function(){ 
        // console.log('complete'); 
     }); 
2

जांच करें कि उत्तराधिकार।

मेरे पास एक दोषपूर्ण घटना हैंडलर था जिसने एक ही समय में दो अनुरोधों को निकाल दिया और इससे एक ही समस्या हुई।

(मुझे लगता है कि आप $ .ajaxSetup को एक बार कॉल करते हैं): ऐसा लगता है कि आप अपने पिंग कॉल के लिए कैश बस्टर लागू करना चाहते हैं, लेकिन इसे $ .ajaxSetup में कर रहे हैं इसके विपरीत प्रभाव हो सकता है क्योंकि यूआरएल के लिए तय किया जाएगा सभी बाद के अनुरोध।

15

आप होगा इस व्यवहार मिलता है जब आपके JSONP कॉल का समय समाप्त (जो दो सेकंड, अपने timeout: 2000 लाइन के अनुसार) है, लेकिन डेटा के बाद आता है टाइमआउट हुआ है।

JSONP सामान्य XmlHTTPRequest का उपयोग नहीं करता है। JSONP करने के लिए, jQuery आपके दस्तावेज़ में एक स्क्रिप्ट टैग डालता है और स्क्रिप्ट टैग लोडिंग को संभालने के लिए एक अस्थायी फ़ंक्शन बनाता है (फ़ंक्शन का नाम त्रुटि संदेश में उस लंबे यादृच्छिक स्ट्रिंग है)।

जब आपका टाइमआउट होता है और स्क्रिप्ट अभी तक लोड नहीं हो पाती है, तो jQuery अस्थायी फ़ंक्शन को छोड़ देता है। उसके बाद, स्क्रिप्ट टैग लोडिंग समाप्त हो जाता है, और उस फ़ंक्शन को आमंत्रित करने का प्रयास करता है - लेकिन बहुत देर हो चुकी है, फ़ंक्शन हटा दिया गया है। इसलिए त्रुटि।

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

शायद आपकी सबसे अच्छी शर्त इसके साथ रहना है।

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