JavaScript कंसोल.लॉग त्रुटि का कारण बनता है: "मुख्य थ्रेड पर सिंक्रोनस XMLHttpRequest को हटा दिया गया है ..."


386

मैं फ़ायरफ़ॉक्स डीबगर का उपयोग किए बिना विभिन्न चर की स्थिति की जांच करने के लिए कंसोल में लॉग जोड़ रहा हूं।

हालाँकि, कई जगहों पर मैं console.logअपनी main.jsफ़ाइल में एक जोड़ देता हूँ , मुझे अपने प्यारे छोटे हस्तलिखित संदेशों के बजाय निम्नलिखित त्रुटि मिलती है:

मुख्य थ्रेड पर सिंक्रोनस XMLHttpRequest अंत उपयोगकर्ता के अनुभव के लिए हानिकारक प्रभावों के कारण हटा दिया गया है। अधिक मदद के लिए http://xhr.spec.whatwg.org/

क्या console.logमैं अपने कोड के उपयोग के लिए विकल्प या रैपर जोड़ सकता हूं जो इस त्रुटि का कारण नहीं होगा?

क्या मैं "गलत कर रहा हूँ"?


8
मैं नहीं देखता कि कैसे एक सांत्वना.लॉग () कॉल एक अजाक्स कॉल का कारण बनेगी, जब तक कि किसी प्रकार का रिमोट लॉगिंग प्लगइन सक्षम या जो भी हो।
मार्क बी

मुझे यकीन नहीं है कि यह एक अजाक्स कॉल कर रहा है। यदि मैं एक स्क्रीनशॉट शामिल करता हूं तो क्या यह मदद करेगा?
नाथन बसानी

6
xmlhttprequest मूल रूप से एक अजाक्स अनुरोध है।
मार्क बी

14
<script>$.ajaxPrefilter(function( options, originalOptions, jqXHR ) { options.async = true; });</script> यह चेतावनी को हटा देगा। आप एक ही मुद्दे के लिए यहां देख सकते हैं ।
अकिल्स्री 1

1
मैं सिर्फ पोस्ट के बजाय इस्तेमाल किया, यह मदद की। jQuery।
स्टास कज़ानिन

जवाबों:


278

यह मेरे साथ तब हुआ जब मैं आलसी हो रहा था और इसमें शामिल किए जा रहे कंटेंट के हिस्से के रूप में एक स्क्रिप्ट टैग शामिल था। जैसे की:

आंशिक HTML सामग्री:

<div> 
 SOME CONTENT HERE
</div>
<script src="/scripts/script.js"></script> 

ऐसा प्रतीत होता है, कम से कम मेरे मामले में, यदि आप HTML सामग्री को उस तरह से वापस लाते हैं, तो आप उस स्क्रिप्ट को प्राप्त करने के लिए कॉल करने के लिए jQuery का कारण बनेंगे। यह कॉल एक async फ्लैग झूठे के साथ होता है क्योंकि यह मानता है कि आपको लोड जारी रखने के लिए स्क्रिप्ट की आवश्यकता है।

इस तरह की स्थितियों में आप बेहतर ढंग से किसी प्रकार की बाध्यकारी रूपरेखा को देखते हुए और सिर्फ JSON ऑब्जेक्ट लौटाते हुए, या अपने बैकएंड पर निर्भर करते हुए और आप अपनी स्क्रिप्ट्स को लोड करने के तरीके बदल सकते हैं।

प्रासंगिक स्क्रिप्ट को हथियाने केgetScript() लिए आप jQuery का उपयोग भी कर सकते हैं । यहाँ एक फिडेल है, यह jQuery के उदाहरण की एक सीधी प्रतिलिपि है, लेकिन जब स्क्रिप्ट को इस तरह से लोड किया जाता है तो मुझे कोई चेतावनी नहीं दिखाई देती है।

उदाहरण

<script>
var url = "/scripts/script.js";
$.getScript(url);
</script>

http://jsfiddle.net/49tkL0qd/


8
त्रुटि यह है कि क्योंकि ओपी कहीं एक तुल्यकालिक XMLHttpRequests का उपयोग कर रहा है, मुझे नहीं लगता कि कारण jquery के बाद से ऐसा नहीं लगता है कि वह इसका उपयोग करता है ... हालांकि यह मेरे साथ तब हो रहा है जब मैं <script>एक कॉलबैक में कहा गया है जैसा कि आप लोड करने की कोशिश करते हैं अजाक्स अतुल्यकालिक कॉल का। मेरे ajax कॉल लेकिन मैं बनाने के कॉलबैक में अतुल्यकालिक है $('#object').html(data)जहां डाटा का एक टुकड़ा है htmlके साथ <script>इस लाइन और जब में त्रुटि दिखाई देती है निष्पादित किया जाता है js console। +1 !!! धन्यवाद :)
एल्बसिफ

2
इस परियोजना के लिए, मैंने वास्तव में, JQuery का उपयोग किया।
नाथन बसानी

1
@ 37coins, यदि यह उत्तर था; इसे ऐसे ही चिह्नित करें .. और जावास्क्रिप्ट टैग को jQuery के साथ बदलें।
ब्रेट कैसवेल

3
यह मेरी समस्या थी, और सबसे अधिक संभावना है कि ओपी की समस्या भी - ओपी कृपया इसे उत्तर के रूप में चिह्नित करने पर विचार करें। वर्तमान में यहां उच्च मतदान जवाब इस समस्या से ग्रस्त लोगों की मदद करने के लिए कुछ नहीं करता है, इसलिए इस उत्तर को स्वीकार करने से दूसरों को काफी मदद मिलेगी।
निक कोड

1
सिर्फ FYI करें jQuery गेटस्क्रिप्ट कैशिंग को तोड़ता है। मुझे लगता है कि .ajax वही करेगा और कैशिंग के लिए अनुमति देगा
रोनी रोइस्टन

75

चेतावनी संदेश MAY BE हो सकता है एक XMLHttpRequest अनुरोध के कारण मुख्य थ्रेड के भीतर async ध्वज झूठा सेट के साथ।

https://xhr.spec.whatwg.org/#synchronous-flag :

श्रमिकों के बाहर सिंक्रोनस XMLHttpRequest वेब प्लेटफॉर्म से निकाले जाने की प्रक्रिया में है क्योंकि इसका अंतिम उपयोगकर्ता के अनुभव पर हानिकारक प्रभाव पड़ता है। (यह एक लंबी प्रक्रिया है जिसमें कई वर्षों का समय लगता है।) डेवलपर्स को async तर्क के लिए गलत पास नहीं करना चाहिए जब जावास्क्रिप्ट वैश्विक वातावरण एक दस्तावेज़ वातावरण होता है। उपयोगकर्ता एजेंटों को डेवलपर टूल में ऐसे उपयोग के बारे में चेतावनी देने के लिए दृढ़ता से प्रोत्साहित किया जाता है और ऐसा होने पर InvalidAccessError अपवाद को फेंकने का प्रयोग कर सकता है।

भविष्य की दिशा केवल कार्यकर्ता थ्रेड्स में XMLHttpRequests की अनुमति है। संदेश उस आशय के लिए एक चेतावनी है।


6
नहीं, संदेश चेतावनी मुख्य रूप से एक XMLHttpRequest अनुरोध के कारण मुख्य थ्रेड के भीतर async फ्लैग के साथ सेट है जो गलत है। यह बहुत अच्छी तरह से फ़ायरफ़ॉक्स में एक बग हो सकता है (लेकिन यह एक jQuery सुविधा / कार्यान्वयन की संभावना है); किसी भी तरह से, कल्पना के भाग का वर्णन कैसे किया जा सकता है, इस सवाल का जवाब माना जाता है कि दावा console.logइन चेतावनियों को भेज रहा है?
ब्रेट कैसवेल

1
@ ब्रेट - मेरे उत्तर के अंतिम दो वाक्य बताते हैं कि मैंने जो कल्पना की थी उसका हिस्सा क्यों शामिल किया। मैं अपने उत्तर को अधिक सटीक होने के लिए संपादित करूंगा।
पेडिकैडैन

2
सभी ने कहा कि, इस उत्तर में आपके द्वारा बताई गई सब कुछ सही जानकारी है; इसके अलावा यह संभावित समस्या के लिए प्रासंगिक है; यही है, इस चेतावनी का पालन डिबगर के व्यवहार और / या स्थिरता को प्रभावित करता है। इस प्रकार, वर्कअराउंड के कारण को सही करके चेतावनी को बढ़ाने से रोकने के लिए बहुत अच्छी तरह से हो सकता है।
ब्रेट कैसवेल

उन्हें स्थानीय डिबगिंग के लिए सक्षम करने के लिए एक ध्वज: ध्वज जोड़ना चाहिए। लोकलहोस्ट पर चलने वाले टूलिंग / डिबग फ्रेमवर्क के लिए सिंक XHR बहुत उपयोगी हो सकता है।
user2800679

62

मैं भी एक ही मुद्दे का सामना कर रहा था, लेकिन इसे async लगाकर ठीक कर सकता था: सच। मुझे पता है कि यह डिफ़ॉल्ट रूप से सही है लेकिन जब मैं इसे स्पष्ट रूप से लिखता हूं तो यह काम करता है

$.ajax({
   async: true,   // this will solve the problem
   type: "POST",
   url: "/Page/Method",
   contentType: "application/json",
   data: JSON.stringify({ ParameterName: paramValue }),
});

2
यह मेरे मामले में कारण नहीं था ... केवल async को हटाने: झूठे बिना सच में बदलने के लिए तय है कि
hsobhy

@ मेरे मामले में यह सिंक सेट कर रहा था: झूठे ने मदद की!
t_plusplus

34

विजुअल स्टूडियो 2015/2017 के लाइव डिबगर कोड को इंजेक्ट कर रहा है जिसमें डिप्रेक्टेड कॉल है।


13
मैंने यह जानने में काफी समय बिताया कि मैं यह चेतावनी क्यों देख रहा था; मुझे लगा कि मैं सबसे उपयुक्त SO प्रश्न पर साझा करूंगा ताकि अन्य कुछ समय बचा सकें।
चार्ली

22

कभी-कभी यह स्क्रिप्ट को लोड करने के लिए आवश्यक है लेकिन स्क्रिप्ट लोड होने के बाद तैयार दस्तावेज़ में देरी ।

jQuery holdReady()फ़ंक्शन के साथ इसका समर्थन करता है।

उदाहरण उपयोग:

$.holdReady(true);                              //set hold
function releaseHold() { $.holdReady(false); }  //callback to release hold
$.getScript('script.js', releaseHold);          //load script then release hold

वास्तविक स्क्रिप्ट लोड करना अतुल्यकालिक ( कोई त्रुटि नहीं ) है, लेकिन यदि दस्तावेज़ तैयार होने के बाद आपके जावास्क्रिप्ट के बाकी रन के साथ है, तो यह प्रभाव तुल्यकालिक है ।

यह उन्नत सुविधा आमतौर पर डायनामिक स्क्रिप्ट लोडर द्वारा उपयोग की जाएगी जो अतिरिक्त जावास्क्रिप्ट को लोड करना चाहते हैं जैसे कि jQuery प्लगइन्स तैयार होने की अनुमति देने से पहले, भले ही डोम तैयार हो सकता है।

प्रलेखन:
https://api.jquery.com/jquery.holdready


UPDATE 7 जनवरी 2019

से JQMIGRATE :

jQuery.holdReady () पदावनत है

कारण:jQuery.holdReady() विधि पेज के वैश्विक प्रदर्शन पर उसके हानिकारक प्रभाव की वजह से मान्य नहीं है। यह विधि पृष्ठ पर सभी कोड को समय की विस्तारित लंबाई के लिए प्रारंभिक करने से रोक सकती है।

समाधान: पृष्ठ को फिर से लिखें ताकि इसे विलंबित करने के लिए सभी jQuery के तैयार हैंडलर की आवश्यकता न हो। यह पूरा किया जा सकता है, उदाहरण के लिए, देर से लोड करने से केवल उस कोड की आवश्यकता होती है जिसे चलाने के लिए सुरक्षित होने पर देरी की आवश्यकता होती है। इस पद्धति की जटिलता के कारण, jQuery माइग्रेट कार्यक्षमता को भरने का प्रयास नहीं करता है। यदि jQuery के अंतर्निहित संस्करण का उपयोग jQuery के माइग्रेट के साथ किया जाता है, तो jQuery.holdReady()इस चेतावनी के प्रकट होने के तुरंत बाद कोड विफल हो जाएगा।


17

इस चेतावनी से बचने के लिए, उपयोग न करें:

async: false

आपके किसी भी $ .ajax () कॉल में। यह XMLHttpRequest की एकमात्र विशेषता है जिसे अपदस्थ किया गया है।

डिफ़ॉल्ट है

async: true

jQuery ने सिंक्रोनाइज़्ड XMLHTTPRequest को हटा दिया है


13

@Webgr आंशिक उत्तर ने वास्तव में मुझे इस चेतावनी @ कंसोल लॉग को डीबग करने में मदद की, उस उत्तर के अन्य भाग को शर्मिंदा कर दिया ताकि बहुत सारे डाउनवोट आए ...

वैसे भी, यहाँ बताया गया है कि मेरे मामले में इस चेतावनी का कारण क्या था:

  1. DevTools लाने के लिए क्रोम ब्राउज़र> F12 का उपयोग करें
  2. दराज मेनू खोलें (ऊपरी दाईं ओर Chrome 3 ऊर्ध्वाधर डॉट्स)
  3. कंसोल के तहत > प्रवेश XMLHttpRequests विकल्प की जाँच करें
  4. अपने पृष्ठ को पुनः लोड करें जो आपको त्रुटि दे रहा था और देखें कि कंसोल लॉग में प्रत्येक ajax अनुरोध पर क्या होता है।

मेरे मामले में, एक अन्य प्लगइन प्रत्येक ajax कॉल के बाद 2 .js पुस्तकालयों को लोड कर रहा था , जो बिल्कुल आवश्यक नहीं थे और न ही आवश्यक थे। दुष्ट प्लगइन को अक्षम करने से लॉग से चेतावनी हटा दी गई। उस बिंदु से, आप या तो समस्या को स्वयं ठीक करने का प्रयास कर सकते हैं (उदाहरण के लिए स्क्रिप्ट को कुछ पृष्ठों या घटनाओं तक लोड करना सीमित करें - यह यहाँ एक उत्तर के लिए बहुत विशिष्ट है) या इसे हल करने के लिए 3 पार्टी प्लगइन डेवलपर से संपर्क करें।

आशा है कि यह किसी की मदद करता है।


// , जवाब के लिए धन्यवाद! यह प्रश्न केवल फ़ायरफ़ॉक्स को संदर्भित करता है। मुझे यह देखने में दिलचस्पी है कि यह क्रोम पर हुआ है। यह वास्तव में समस्या को ठीक करने के बजाय केवल चेतावनी को हटाने के लिए लगता है, हालांकि। क्या वो सही है?
नाथन बसानी

ऐसा लगता है कि क्रोम में फ़ायरफ़ॉक्स संस्करण की तुलना में DevTools में अधिक उन्नत सामान है। तथ्य यह है कि यह फ़ायरफ़ॉक्स में रिपोर्ट नहीं किया गया है इसका मतलब यह नहीं है कि यह मौजूद नहीं है। इसने मेरी समस्या को पूरी तरह से ठीक कर दिया, न कि इसे छिपा दिया। मैंने समस्याग्रस्त प्लगइन और पृष्ठ से उन लिपियों को हटा दिया है जो प्रत्येक अजाक्स कॉल पर 'पुनः लोड' की गई थीं।
dev101 16

//, क्या आपको लगता है कि यह फ़ायरफ़ॉक्स डेवलपर्स के साथ एक मुद्दा उठाने लायक है?
नाथन बसानी

नहीं, आवश्यक नहीं। मैंने अभी हाल के फ़ायरफ़ॉक्स और "मुख्य धागे पर सिंक्रोनस XMLHttpRequest" के साथ अपने मामले का फिर से परीक्षण किया है ... कंसोल लॉग में चेतावनी निश्चित रूप से रिपोर्ट की गई थी, साथ ही साथ। तो, यह कम से कम मेरे मामले में था, न कि एक ब्राउज़र विशिष्ट मुद्दा। अब, आप प्रत्येक ajax अनुरोध के बाद .js संसाधनों को देखने के द्वारा नेटवर्क टैब के माध्यम से XMLHttpRequest को डीबग करने के लिए फ़ायरफ़ॉक्स का उपयोग कैसे कर सकते हैं। वही काम करता है, हालांकि यह क्रोम में अधिक सुव्यवस्थित / फ़िल्टर्ड है। developer.mozilla.org/en-US/docs/Tools/Network_Monitor
dev101

8

मैं सभी प्रभावशाली जवाब देख रहा हूं। मुझे लगता है कि उसे कोड प्रदान करना चाहिए जो उसे एक समस्या दे रहा है। नीचे दिए गए उदाहरण को देखते हुए, यदि आपके पास page.php में jquery से लिंक करने के लिए एक स्क्रिप्ट है तो आपको वह सूचना मिल जाएगी।

$().ready(function () {
    $.ajax({url: "page.php",
        type: 'GET',
        success: function (result) {
        $("#page").html(result);
   }});
 });

6

मुझे निम्नलिखित मामले में इस तरह की चेतावनी मिलती है:

1) file1 जिसमें सम्‍मिलित है <script type="text/javascript" src="/javascript/jquery-1.10.2.js"></script>। पृष्ठ में इनपुट फ़ील्ड हैं। मैं इनपुट फ़ील्ड में कुछ मूल्य दर्ज करता हूं और बटन पर क्लिक करता हूं। Jquery बाहरी php फ़ाइल में इनपुट भेजता है।

2) बाहरी php फ़ाइल में jquery भी होती है और बाहरी php फ़ाइल में मैं भी शामिल होता हूँ <script type="text/javascript" src="/javascript/jquery-1.10.2.js"></script>। क्योंकि अगर यह मुझे चेतावनी मिली।

<script type="text/javascript" src="/javascript/jquery-1.10.2.js"></script>बाहरी php फ़ाइल से हटाया गया और चेतावनी के बिना काम करता है।

जैसा कि मैं पहली फ़ाइल (file1) को लोड करने पर समझता हूं, मैं लोड jquery-1.10.2.jsकरता हूं और जैसा कि पृष्ठ फिर से लोड नहीं करता है (यह jquery का उपयोग करके बाहरी php फ़ाइल को डेटा भेजता है $.post), फिर jquery-1.10.2.jsमौजूद रहता है। इसलिए इसे लोड करने के लिए फिर से आवश्यक नहीं है।


5

मुझे यह अपवाद तब मिला जब मैंने "example.com/files/text.txt" जैसे क्वेरी में url सेट किया। Ive ने url को " http://example.com/files/text.txt " में बदल दिया और यह अपवाद समाप्त हो गया।


मेरा मुद्दा URL के साथ भी लगता है। मैंने इस पर काम करने के लिए एक अस्थायी URL पर एक स्क्रिप्ट की प्रतिलिपि बनाई, और वह यह है कि जब त्रुटि दिखाई गई। मूल URL से नहीं।
jeffery_the_wind

5

और मुझे यह अपवाद मिला है जिसमें एक कैन। Ss स्क्रिप्ट दूसरे के अंदर, उदाहरण के लिए,

{{>anotherScript}}

यह मुख्य कारण प्रतीत होता है (अतिरिक्त <स्क्रिप्ट्स को लोड करना और उन्हें <head> को DOM में जोड़ना)
Nerdaholic

5

MVC एप्लिकेशन में, मुझे यह चेतावनी मिली क्योंकि मैं एक Kendo विंडो खोल रहा था जिसमें एक PartialView () के बजाय एक View () लौट रहा था। दृश्य () पृष्ठ की सभी लिपियों को फिर से पुनः प्राप्त करने का प्रयास कर रहा था।


5

यह ZF2 में मेरे साथ हो रहा था। मैं मोडल सामग्री को लोड करने की कोशिश कर रहा था लेकिन मैं लेआउट को निष्क्रिय करना भूल गया।

इसलिए:

$viewModel = new ViewModel();
$viewModel->setTerminal(true);
return $viewModel;

5

@Nycen की तरह मुझे भी यह त्रुटि Cloudfare के लिंक के कारण मिली। मेरा चयन Select2 प्लगइन के लिए था ।

इसे ठीक करने के लिए मैंने अभी हटा दिया

 src="//cdnjs.cloudflare.com/ajax/libs/select2/4.0.0/js/select2.min.js"

और त्रुटि दूर हो गई।


5
  1. क्रोम में, press F12
  2. डेवेलपिंग टूल्स-> प्रेस F1
  3. सेटिंग्स देखें-> सामान्य-> उपस्थिति: "Don't show chrome Data Saver warning"- यह चेकबॉक्स सेट करें।
  4. सेटिंग्स देखें-> सामान्य-> कंसोल: "Log XMLHTTPRequest"- इस चेकबॉक्स को भी सेट करें।

का आनंद लें



4

मेरे मामले में यह के कारण हुई थी flexie स्क्रिप्ट जो "CDNJS चयन" द्वारा की पेशकश की एप्लिकेशन का हिस्सा था CloudFlare

Cloudflare के अनुसार "इस एप्लिकेशन को मार्च 2015 में पदावनत किया जा रहा है"। मैंने इसे बंद कर दिया और संदेश तुरंत गायब हो गया।

आप https://www.cloudflare.com/a/cloudflare-apps/yourdomain.com पर जाकर एप्स को एक्सेस कर सकते हैं

NB: यह इस सूत्र पर मेरे उत्तर की एक प्रति है। सिंक्रोनस XMLHttpRequest चेतावनी और <स्क्रिप्ट> (मैं एक समाधान की तलाश में दोनों का दौरा किया)


3

मैंने इसे निम्न चरणों के साथ तय किया है:

  1. अपनी CDN स्क्रिप्ट जांचें और उन्हें स्थानीय रूप से जोड़ें।
  2. अपनी स्क्रिप्ट्स को हेडर सेक्शन में शामिल करें।

3

अपने विशेष मामले में मैं आंशिक रूप से एक रेंडर प्रदान कर रहा था render layout: falseजिसके बिना <head>टैग में सभी लिपियों सहित पूरे लेआउट को फिर से प्रस्तुत कर रहा था । render layout: falseनियंत्रक कार्रवाई में जोड़ने से समस्या ठीक हो गई।


3

मेरे लिए, समस्या यह थी कि एक ठीक अनुरोध में, मैं ajax प्रतिक्रिया की उम्मीद करता था कि एक अच्छी तरह से स्वरूपित HTML स्ट्रिंग है जैसे कि एक तालिका, लेकिन इस मामले में, सर्वर अनुरोध के साथ एक समस्या का सामना कर रहा था, एक त्रुटि पृष्ठ पर पुनर्निर्देशित कर रहा था। और इसलिए त्रुटि पृष्ठ का HTML कोड वापस आ रहा था (जिसमें <scriptकहीं एक टैग था । मैंने सांत्वना दी ajax प्रतिक्रिया। और जब मुझे एहसास हुआ कि यह वह नहीं है जो मैं उम्मीद कर रहा था, तो मेरे डिबगिंग करने के लिए आगे बढ़े।


2

प्रश्न 2014 में उठा और यह 2019 है, इसलिए मुझे लगता है कि बेहतर विकल्प की तलाश करना अच्छा है।

आप बस fetchजावास्क्रिप्ट में एपीआई का उपयोग कर सकते हैं जो आपको अधिक लचीलापन प्रदान करते हैं।

उदाहरण के लिए, यह कोड देखें

fetch('./api/some.json')
    .then((response) => {
        response.json().then((data) => { 
            ... 
        });
    })
    .catch((err) => { ... });

क्या यह शुद्ध js, कोई प्लगइन की आवश्यकता है?
आलोक

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.