JavaScript console.log가 오류를 발생시킵니다. "주 스레드에서 동기 XMLHttpRequest가 사용되지 않습니다…"


386

Firefox 디버거를 사용하지 않고 다른 변수의 상태를 확인하기 위해 콘솔에 로그를 추가했습니다.

그러나 많은 장소에서하는 난이 추가 console.log내에서 main.js파일, 나 자신에 대신 내 사랑스러운 작은 손으로 쓴 메시지의 다음과 같은 오류가 나타납니다

기본 스레드의 동기 XMLHttpRequest는 최종 사용자의 경험에 해로운 영향으로 사용되지 않습니다. 도움이 더 필요하면 http://xhr.spec.whatwg.org/

console.log이 오류를 발생시키지 않는 코드 사용에 어떤 대안이나 래퍼를 추가 할 수 있습니까?

"잘못하고 있습니까?"


8
어떤 종류의 원격 로깅 플러그인이 활성화되어 있지 않으면 console.log () 호출이 어떻게 ajax 호출을 일으키는 지 알 수 없습니다.
Marc B

그것이 아약스 전화를하고 있는지 확실하지 않습니다. 스크린 샷을 포함 시키면 도움이 되나요?
Nathan Basanese

6
xmlhttprequest는 기본적으로 아약스 요청입니다.
Marc B

14
<script>$.ajaxPrefilter(function( options, originalOptions, jqXHR ) { options.async = true; });</script> 경고가 제거됩니다. 동일한 문제에 대해 여기 를 볼 수 있습니다 .
Akilsree1

1
방금 게시물 대신 get을 사용했는데 도움이되었습니다. jQuery.
Stas Kazanin '

답변:


278

이것은 게으르고 있었고 반환되는 내용의 일부로 스크립트 태그를 포함했을 때 나에게 일어났습니다. 따라서 :

부분 HTML 내용 :

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

적어도 내 경우에는 xhr을 통해 HTML 콘텐츠를 반환하면 jQuery가 해당 스크립트를 가져 오기 위해 호출하게됩니다. 이 호출은로드를 계속하려면 스크립트가 필요하다고 가정하기 때문에 비동기 플래그가 false로 발생합니다.

이와 같은 상황에서는 일종의 바인딩 프레임 워크를 조사하고 JSON 객체를 반환하거나 백엔드 및 템플릿에 따라 스크립트로드 방법을 변경할 수 있습니다.

jQuerygetScript() 를 사용 하여 관련 스크립트를 가져올 수도 있습니다 . 여기에 바이올린이 있습니다. jQuery 예제의 간단한 사본이지만 스크립트가로드 될 때 경고가 표시되지 않습니다.

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

http://jsfiddle.net/49tkL0qd/


8
오류는 OP가 동기 XMLHttpRequests 어딘가를 사용하고 있기 때문에 jquery가 그것을 사용하지 않는 것 같아서 생각하지 않습니다 ... 그러나 <script>콜백에서 말한대로 로드하려고하면이 문제가 발생합니다. 아약스 비동기 호출의. 내 아약스 호출하지만 콜백에 걸 비동기 $('#object').html(data)데이터의 조각입니다 html함께 <script>이 라인은에서 오류가 나타납니다 실행되는 때 js console. +1 !!! 감사 :)합니다.
albciff

2
이 프로젝트에서는 실제로 JQuery를 사용했습니다.
Nathan Basanese

1
이것이 대답이라면 @ 37coins; 그렇게 표시하십시오. javascript 태그를 jQuery로 바꾸십시오.
Brett Caswell

3
이것은 내 문제 였고 OP의 문제 일 가능성이 큽니다. OP는 이것을 답변으로 표시하십시오. 여기에서 높은 투표 응답은 현재이 문제를 가진 사람들을 도울 수있는 것이 아니므로이 답변을 수락하면 다른 사람들에게 큰 도움이 될 것입니다.
Nick Coad

1
참고로 jQuery getScript는 캐싱을 중단합니다. 나는 아약스가 동일 할 것이라고 생각하고 캐싱을 허용
로니 로이스 톤을

75

비동기 플래그가 false로 설정된 주 스레드 내의 XMLHttpRequest 요청으로 인해 경고 메시지가 발생할 수 있습니다.

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

작업자 외부의 동기 XMLHttpRequest는 최종 사용자의 경험에 해로운 영향을 미치므로 웹 플랫폼에서 제거되고 있습니다. (이 과정은 오랜 시간이 걸린다.) JavaScript 전역 환경이 문서 환경 인 경우 개발자는 비동기 인수에 대해 false를 전달해서는 안된다. 사용자 에이전트는 개발자 도구에서의 이러한 사용에 대해 경고 할 것을 강력히 권장하며 InvalidAccessError 예외가 발생하면이를 실험 해 볼 수 있습니다.

미래의 방향은 작업자 스레드에서만 XMLHttpRequests를 허용하는 것입니다. 메시지는 그러한 영향을 경고하기위한 것입니다.


6
아니오, 비동기 플래그가 false로 설정된 기본 스레드 내의 XMLHttpRequest 요청으로 인해 메시지 경고는 PRESUMABLY 입니다. 이것은 Firefox의 버그 일 수 있지만 jQuery 기능 / 구현 일 가능성이 높습니다. 어느 쪽이든, 사양의 일부를 설명하는 것이 어떻게 console.log이러한 경고를 보내는 주장에 대한 답변으로 간주 됩니까?
Brett Caswell

1
@Brett-내 대답의 마지막 두 문장은 왜 내가 한 스펙의 일부를 포함했는지 설명합니다. 보다 정확한 답변을 편집하겠습니다.
PedanticDan

2
이 답변에 언급 한 모든 것은 정확한 정보입니다. 또한 문제 가능성과 관련이 있습니다. 즉,이 경고가 발생하면 디버거의 동작 및 / 또는 안정성에 영향을줍니다. 따라서 해결 방법은 경고의 원인을 수정하여 경고가 발생하지 않도록하는 것입니다.
Brett Caswell

로컬 디버깅을 위해 about : flag를 추가해야합니다. Sync XHR은 localhost를 실행하는 툴링 / 디버그 프레임 워크에 매우 유용 할 수 있습니다.
user2800679

62

나는 또한 같은 문제에 직면했지만 async : true를 넣어서 해결할 수 있습니다. 나는 그것이 기본적으로 사실이라는 것을 알고 있지만 명시 적으로 쓸 때 작동합니다.

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

2
제 경우에는 그 이유가 아니 었습니다 ... async : false 만 제거하면 true로 변경하지 않고 고정됩니다.
hsobhy

내 경우에는 @Irfan 동기화를 설정하는 중입니다 : false가 도움이되었습니다!
t_plusplus

34

Visual Studio 2015/2017의 라이브 디버거에서 더 이상 사용되지 않는 호출이 포함 된 코드를 주입하고 있습니다.


13
나는 왜이 경고를보고 있었는지 알아 내려고 꽤 많은 시간을 보냈습니다. 다른 사람들이 시간을 절약 할 수 있도록 가장 적절한 SO 질문을 공유 할 것이라고 생각했습니다.
Charlie

22

때때로 아약스는 스크립트를로드해야하지만 문서 준비는 지연 스크립트가로드 될 때까지 될 수 있습니다.

jQuery는이 holdReady()기능을 지원 합니다.

사용법 예 :

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

실제 스크립트 로딩은 비동기 적이지만 ( 오류 없음 ) 문서의 준비가 완료된 후 나머지 JavaScript가 실행되면 효과는 동기화됩니다 .

고급 기능 은 일반적으로 DOM이 준비되어 있어도 ready 이벤트가 발생하기 전에 jQuery 플러그인과 같은 추가 JavaScript를로드하려는 동적 스크립트 로더에서 사용됩니다.

설명서 :
https://api.jquery.com/jquery.holdready


업데이트 2019 년 1 월 7 일

에서 JQMIGRATE :

jQuery.holdReady ()는 더 이상 사용되지 않습니다

원인 :jQuery.holdReady() 방법은 페이지의 글로벌 성능에 미치는 해로운 영향으로 인해 더 이상 사용되지 않습니다. 이 방법을 사용하면 페이지의 모든 코드가 장시간 초기화되지 않을 수 있습니다.

솔루션 : 모든 jQuery 준비 핸들러가 지연되지 않도록 페이지를 다시 작성하십시오. 예를 들어 실행이 안전 할 때 지연이 필요한 코드 만 늦게로드하여이를 수행 할 수 있습니다. 이 방법의 복잡성으로 인해 jQuery Migrate는 기능을 채우려 고 시도하지 않습니다. jQuery Migrate와 함께 사용되는 jQuery의 기본 버전에 더 이상 jQuery.holdReady()코드가 포함되어 있지 않으면 이 경고가 나타난 직후 코드가 실패합니다.



13

@Webgr 부분 답변은 실제로 콘솔 로그 에서이 경고를 디버깅하는 데 도움이되었습니다. 답의 다른 부분은 너무 많은 다운 투표를 가져 왔습니다.

어쨌든, 여기 내 경우 에이 경고의 원인이 무엇인지 어떻게 알 수 있습니까?

  1. Chrome 브라우저> Hit F12를 사용하여 DevTools 가져 오기
  2. 서랍 메뉴를 엽니 다 (오른쪽 상단의 Chrome 3 세로 점)
  3. 콘솔 아래에서 로그 XMLHttpRequests 확인 옵션
  4. 오류가 발생한 페이지를 다시로드하고 콘솔 로그의 각 ajax 요청에서 발생하는 상황을 관찰하십시오.

제 경우에는 다른 플러그인이 2 개의 .js 라이브러리를 로드했습니다. 각 ajax 호출 후 하고 있었으며 절대 필요하지는 않았습니다. 악성 플러그인을 비활성화하면 로그에서 경고가 제거되었습니다. 이 시점에서 문제를 직접 해결하거나 (예 : 특정 페이지 나 이벤트에 대한 스크립트로드 제한-여기에 대한 답변이 너무 구체적 임) 타사 플러그인 개발자에게 문의하여 문제를 해결할 수 있습니다.

이것이 누군가를 돕기를 바랍니다.


// , 답변 해주셔서 감사합니다! 이 질문은 Firefox에만 해당됩니다. Chrome에서 발생했음을 알고 싶습니다. 그래도 실제로 문제를 해결하는 것이 아니라 경고 만 제거하는 것 같습니다. 그 맞습니까?
Nathan Basanese

Chrome은 DevTools에서 Firefox 버전보다 고급 기능을 가지고있는 것 같습니다. Firefox에서보고되지 않았다고해서 존재하지 않는다는 의미는 아닙니다. 이것은 단지 내 문제를 숨기지 않고 완전히 수정했습니다. 각 아약스 호출에서 '다시로드 된'문제가있는 플러그인 및 페이지에서 스크립트를 제거했습니다.
dev101

//, Firefox 개발자들에게 문제를 일으킬 가치가 있다고 생각하십니까?
Nathan Basanese

필요하지 않습니다. 방금 최신 Firefox에서 내 사례를 다시 테스트했으며 콘솔 로그에도 "주 스레드에서 동기 XMLHttpRequest ..."경고가보고되었습니다. 따라서 적어도 내 경우에는 브라우저 관련 문제가 아니 었습니다. 이제 각 ajax 요청 후에 호출되는 .js 리소스를 보면서 Firefox를 사용하여 네트워크 탭을 통해 XMLHttpRequest를 디버깅하는 방법. Chrome에서보다 간소화 / 필터링되었지만 동일한 작업을 수행합니다. 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 파일에는 i도 포함되어 있습니다 <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을 설정할 때이 예외가 발생했습니다. URL을 " http://example.com/files/text.txt "로 변경 했는데이 예외는 사라졌습니다.


내 문제는 URL과 관련이있는 것 같습니다. 작업을 위해 스크립트를 임시 URL에 복사했습니다. 그 때 오류가 나타났습니다. 원래 URL이 아닙니다.
jeffery_the_wind 2016 년

5

그리고 하나의 can.js 스크립트를 다른 것 안에 포함시키는 예외가 있습니다.

{{>anotherScript}}

이 주요 원인합니다 (DOM에 추가 <스크립트>을로드하고 <헤드>로 추가) 될 것으로 보인다
Nerdaholic 복구

5

MVC 응용 프로그램에서 PartialView () 대신 View ()를 반환하는 메서드로 Kendo Window를 열었 으므로이 경고가 발생했습니다. 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. Chrome에서 press F12
  2. 개발 도구->를 누릅니다 F1.
  3. 설정-> 일반 "Don't show chrome Data Saver warning"- > 외관을 참조하십시오 : -이 확인란을 설정하십시오.
  4. 설정-> 일반 "Log XMLHTTPRequest"- > 콘솔을 참조하십시오 : -이 확인란도 설정하십시오.

즐겨



4

필자의 경우 이는 Cloudflare에서 제공하는 "CDNJS Selections"앱의 일부인 flexie 스크립트 로 인해 발생했습니다. .

Cloudflare에 따르면 "이 앱은 2015 년 3 월에 더 이상 사용되지 않습니다." 나는 그것을 끄고 메시지가 즉시 사라졌다.

https://www.cloudflare.com/a/cloudflare-apps/yourdomain.com 을 방문하여 앱에 액세스 할 수 있습니다.

NB :이이 스레드에 대한 내 대답의 복사 동기 XMLHttpRequest의 경고와 <스크립트> (I 두 솔루션을 찾고 때를 방문)


3

나는 이것을 아래 단계로 고쳤다.

  1. CDN 스크립트를 확인하고 로컬로 추가하십시오.
  2. 스크립트 포함을 헤더 섹션으로 이동하십시오.

3

내 특별한 경우에는 Rails 부분을 렌더링하지 않고 태그의 render layout: false모든 스크립트를 포함하여 전체 레이아웃을 다시 렌더링 하지 않았습니다 <head>. render layout: false컨트롤러 작업에 추가 하면 문제가 해결되었습니다.


3

나에게 문제는 OK 요청에서 ajax 응답이 테이블과 같은 형식이 지정된 HTML 문자열 일 것으로 예상했지만이 경우 서버에서 요청에 문제가 발생하여 오류 페이지로 리디렉션되는 것입니다. 따라서 오류 페이지의 HTML 코드를 반환했습니다 ( <script어딘가에 태그가 있습니다. 콘솔이 아약스 응답을 기록했으며 그 시점이 내가 예상 한 것이 아니라는 것을 깨달았을 때 디버깅을 계속했습니다.


2

2014 년에 제기 된 질문과 2019 년이므로 더 나은 옵션을 찾는 것이 좋습니다.

fetchJavascript에서 api 를 사용 하면 더 많은 유연성을 제공 할 수 있습니다.

예를 들어,이 코드를 참조하십시오

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

이 순수한 js입니까, 플러그인이 필요하지 않습니까?
Alok

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.