2010-01-07 13 views
8

मैं किसी अन्य सर्वर पर php फ़ाइल से कुछ सामग्री को शामिल करने के लिए जावास्क्रिप्ट का उपयोग कर रहा हूं। हालांकि, यह दूसरी सेवा कभी-कभी फ्लैकी हो सकती है और या तो लोड करने में काफी समय लग सकता है या बिल्कुल लोड नहीं होगा।जावास्क्रिप्ट के माध्यम से धीमी बाहरी फ़ाइल लोड करते समय समय सीमा सीमा को गहन रूप से लागू करने का कोई तरीका?

क्या जेएस में विफल होने से पहले x संख्या सेकंड के लिए बाहरी डेटा प्राप्त करने का प्रयास करने और "कृपया पुनः प्रयास करें" संदेश प्रदर्शित करने का कोई तरीका है?

<script type="text/javascript" src="htp://otherserver.com/myscript.php"></script> 
+0

... इसके अलावा ... मेरा सर्वर php (या कुछ और .. यह एक याहू स्टोर है) का समर्थन नहीं करता है और यह एक अलग डोमेन पर है कि दूरस्थ सर्वर मैं –

+1

से खींच रहा हूं मुझे नहीं लगता कि वहां है सुर eyou बनाने के अलावा यह करने का एक तरीका है कि विशेष जावास्क्रिप्ट को जितना संभव हो सके पेज पर कम करें, इसलिए शेष पृष्ठ लोड होने पर लोड हो जाता है। –

उत्तर

2

युगल मुद्दों: आप (और सभी ए-ग्रेड ब्राउज़रों का समर्थन) XMLHttpRequest (उर्फ ajax) के साथ समय समाप्ति थ्रेसहोल्ड उपयोग कर सकते हैं, लेकिन फिर आप XMLHttpRequest उपयोग नहीं कर सकते क्योंकि यह एक otherserver.com पर है Same Origin Policy restriction की वजह से।

लिपि (आदि जैसे किसी भी चर नाम कार्यप्रणाली के नाम,) वैश्विक नाम के किसी भी प्रकार आप इसे की जांच करते रहना setTimeout कोशिश कर सकते हैं का परिचय हैं:

var TIMELIMIT = 5; // seconds until timeout 
var start = new Date; 

setTimeout(function() { 
    // check for something introduced by your external script. 
    // A variable, namespace or function name here is adequate: 
    var scriptIncluded = 'otherServerVariable' in window; 

    if(!scriptIncluded) { 
    if ((new Date - start)/1000 >= TIMELIMIT) { 
     // timed out 
     alert("Please try again") 
    } 
    else { 
     // keep waiting... 
     setTimeout(arguments.callee, 100) 
    } 
    } 
}, 100) 

समस्या के रूप में मैं देख रहा हूँ यह है आप नहीं कर सकते स्क्रिप्ट के लिए अनुरोध रद्द करें। अगर कोई गलत है तो कृपया मुझे सही करें लेकिन डीओएम से <script> को हटाकर अभी भी सक्रिय संसाधन के लिए ब्राउज़र का अनुरोध छोड़ देगा। तो हालांकि आप का पता लगा सकते हैं कि स्क्रिप्ट लोड होने के लिए x सेकंड से अधिक समय ले रही है, तो आप अनुरोध को रद्द नहीं कर सकते हैं।

मुझे लगता है कि आप भाग्य से बाहर हो सकते हैं।

-1

मुझे लगता है कि ऐसा करने का एकमात्र तरीका AJAX के माध्यम से फ़ाइल की सामग्री लेना है और फिर टाइमर सेट करना है। यदि अनुरोध टाइमर से पहले खत्म हो जाता है तो आप eval के साथ प्रतिक्रिया का मूल्यांकन कर सकते हैं (यह वैसे भी बेहतर समाधान नहीं है), अन्यथा आप AJAX अनुरोध को रोक सकते हैं और त्रुटि संदेश लिख सकते हैं।

+1

AJAX का उपयोग नहीं कर सकता। लिपि एक अलग डोमेन पर है। – JPot

2

ऐसा करने का एकमात्र तरीका यह है कि मैं पर एक प्रॉक्सी बनाने के लिए (PHP-enabled) सर्वर जो आपके लिए डेटा लाएगा, लेकिन एक निश्चित टाइमआउट सीमा तक पहुंचने पर रोक दी जाएगी (और यह बस एक खाली परिणाम वापस कर सकते हैं)।

0

यह विशुद्ध रूप से, विशुद्ध रूप से सैद्धांतिक है:

<script> टैग गतिशील डोम, जिस बिंदु पर स्क्रिप्ट प्राप्त किए गए और कार्रवाई की जाएगी में डाला जा सकता। यह गतिशील स्क्रिप्ट टैग इंजेक्शन यह है कि कुछ क्रॉस-डोमेन "AJAX" कैसे प्राप्त करते हैं।

मुझे लगता है कि आप वैश्विक चर var hasLoaded = false; घोषित कर सकते हैं। स्क्रिप्ट के अंत में आप लोड करने का प्रयास कर रहे हैं, आप उस चर को सही hadLoaded=true; पर सेट कर सकते हैं। डीओएम में स्क्रिप्ट टैग इंजेक्शन देने के बाद आप एक सेटटाइमआउट() को किकऑफ कर सकते हैं जिसका कॉलबैक फ़ंक्शन यह देखने के लिए जांचता है कि "हैडलोडेड" सत्य पर सेट है या नहीं। यदि ऐसा नहीं है, तो आप मान सकते हैं कि स्क्रिप्ट अभी तक ब्राउज़र में पूरी तरह से लोड नहीं हुई है। यदि यह है, तो आप मान सकते हैं कि यह पूरी तरह से लोड हो गया है।

फिर, यह सैद्धांतिक है, लेकिन यदि आप परीक्षण करते हैं तो यह रिपोर्ट करना सुनिश्चित करें, मैं बहुत उत्सुक हूं।

+0

इसके अलावा, मुझे आश्चर्य है कि डीओएम से स्क्रिप्ट टैग को हटाने से अनुरोध रद्द हो जाता है?शायद मुझे नहीं लगता, लेकिन कोशिश करने के लिए एक और प्रयोग। –

+0

मैंने इसे स्क्रिप्ट टैग के अधिभार में ही देखा है। एक कोशिश के काबिल है। – nagytech