async : false를 $ .getJSON 호출로 설정할 수 있습니까?


105

async: false호출 할 때 $.getJSON()비동기가 아닌 호출이 차단되도록 설정할 수 있습니까?


1
그것은 나쁜 생각입니다 - 그냥이되지 않습니다 이유가있다 .... 콜백에 코드를 넣어
Milney

1
@Milney — 매우 이상합니다… 공식적 으로 사용되지 않습니다. 실제로는 아닙니다 . 정말로 더 이상 사용되지 않았다면 동기화 AJAX 호출 또는 $ ajax.setup 스위치를 만들 가능성이 jQuery 3에서 삭제되었을 것입니다. 사실, 동기화 호출은 때때로 전역을 초기화 할 때 매우 유용합니다. 첫 번째 일괄 처리에 의존하는 다른 전역이있는 경우 JSON 데이터. (콜백 함수에서 전체 초기화 과정을 포장하는 것은 특정 상황에서 매우 까다로운 일이 될 수 있습니다.)
브라이스 Coustillas

동기식 XHR 요청 또는 재구성 코드 가이 경우에 답할 것이라고 생각 합니다 .
Chetabahana

답변:


154

다음과 같이을 사용 $.ajax()하여 동기식으로 호출해야합니다 .

$.ajax({
  url: myUrl,
  dataType: 'json',
  async: false,
  data: myData,
  success: function(data) {
    //stuff
    //...
  }
});

이것은 현재 다음 $.getJSON()과 같이 사용하여 일치 합니다.

$.getJSON(myUrl, myData, function(data) { 
  //stuff
  //...
});

23
편의 메서드 $ .getJSON ()은 거의 유용하지 않으며 항상 $ .ajax ()를 사용합니다.
야곱 대리석

POST 호출에도 이것을 사용할 수 있습니까?
Hitesh

@hitesh 예, type: 'POST'옵션을 추가하여 게시물로 전환 할 async: false수 있습니다. 실제로 필요 하지 않으면 사용하고 싶지 않지만 UI가 잠 깁니다.
Nick Craver

1
이 경우 'myData'는 무엇입니까? 내가 데이터를 삭제할 때 : myData는 완전히 작동합니다 .. ajax 호출에 상당히 새로운 것입니다!
nclsvh 2015-08-05

2
다음과 같은 새로운 문제에 부딪 혔습니다. "작업자 외부의 동기 XMLHttpRequest는 최종 사용자의 경험에 해로운 영향을 미치기 때문에 웹 플랫폼에서 제거되는 과정에 있습니다. (이것은 수년이 걸리는 긴 프로세스입니다.) 개발자는 반드시 항목 설정 개체의 전역 개체가 Window 개체 인 경우 async 인수에 대해 false를 전달하지 마십시오. 사용자 에이전트는 개발자 도구에서 이러한 사용에 대해 경고하도록 강력히 권장하고 발생시 InvalidAccessError 예외를 throw하는 실험을 할 수 있습니다. "
켄 샤프

46

두 가지 대답 모두 틀 렸습니다. 할 수 있습니다. 당신은 전화해야합니다

$.ajaxSetup({
async: false
});

json ajax 호출 전에. 그리고 호출이 재조정 된 후 true로 설정할 수 있습니다 (비 동기화를 원하는 경우 페이지에 ajax의 다른 사용법이있는 경우)


1
문서의 해당 부분을 다시 읽었습니다. 다음은 ajaxSetup에 대해 이야기하는 부분이다 api.jquery.com/jQuery.ajaxSetup 여기 그리고는 옵션입니다이 : api.jquery.com/jQuery.ajax "비동기 기본 : 그것은 분명히 말한다 사실 기본적으로 모든 요청은 비동기 적으로 전송됩니다 ( 즉, 이것은 기본적으로 true로 설정되어 있습니다.) 동기 요청이 필요한 경우이 옵션을 false로 설정합니다. 교차 도메인 요청 및 dataType : "jsonp"요청은 동기 작업을 지원하지 않습니다. "JSONP는 JSON이 아니기 때문에 여전히 그렇다고 생각합니다. 처음부터. 나중에 시간이 생기면 예제를 작성하겠습니다.
velja

7
이것은 늦은 의견이지만 ... "둘 다"잘못된 답변은 무엇입니까? 나는 @Nick Craver의 대답은 허용하고 글로벌 AJAX 설정 (다른 요청이 동시에 발사한다)하지 "엉망"둘 것으로 볼
scunliffe

1
작동하지만 이것은 페이지에서 만드는 모든 ajax 요청에 적용됩니다. 메신저거야 downvote 그래서 나는 그것을 권하고 싶지 않다으로
GabrielBB

3
이것은 매우 낮은 품질의 답변입니다
브라이언 웹스터

1
-1 : 동기식으로 만드는 것은 비용이 많이들 수 있습니다. 프로젝트에서 매번 절대적으로 요구하지 않는 한 호출별로이 작업을 수행해야합니다. 당신의 대답은 당신이 세계에 대한 모든 호출을 구성 할 것을 제안 $.ajax(이후 속기 래퍼 즉 $.getJSON, $.get등) 동기가 될 수 있습니다. 또한 문서 에서는 "설명 : 향후 Ajax 요청에 대한 기본값을 설정합니다. 사용하지 않는 것이 좋습니다."
Carrie Kendall

18

둘 다 옳다고 생각합니다. 나중의 대답은 잘 작동하지만 전역 옵션을 설정하는 것과 같으므로 다음을 수행해야합니다.

    $.ajaxSetup({
        async: false
    });

    //ajax call here

    $.ajaxSetup({
        async: true
    });

10

제 경우에는 Jay D가 맞습니다. 전화하기 전에 이것을 추가해야합니다.

$.ajaxSetup({
    async: false
});

이전 코드에는 다음이 있습니다.

var jsonData= (function() {
    var result;
    $.ajax({
        type:'GET',
        url:'data.txt',
        dataType:'json',
        async:false,
        success:function(data){
            result = data;
        }
    });
    return result;
})();
alert(JSON.stringify(jsonData));

그것은 찾는다. 그런 다음 나는

var jsonData= (function() {
    var result;
    $.getJSON('data.txt', {}, function(data){
      result = data;
    });
    return result;
})();
alert(JSON.stringify(jsonData));

경고가 정의되지 않았습니다.

이 세 줄을 추가하면 경고에 데이터가 다시 표시됩니다.

$.ajaxSetup({
    async: false
});
var jsonData= (function() {
    var result;
    $.getJSON('data.txt', {}, function(data){
      result = data;
    });
    return result;
})();
alert(JSON.stringify(jsonData));

1

await중첩 코드를 피해야 하는 경우 :

let json;
await new Promise(done => $.getJSON('https://***', async function (data) {
    json = data;
    done();
}));

0

거기에서 그 옵션을 설정할 수 없다고 생각합니다. 적절한 매개 변수와 함께 jQuery.ajax () 를 사용해야합니다 (기본적으로 getJSON은 해당 호출을 더 쉬운 API로 래핑합니다).


0

예를 들어 자신의 롤

function syncJSON(i_url, callback) {
  $.ajax({
    type: "POST",
    async: false,
    url: i_url,
    contentType: "application/json",
    dataType: "json",
    success: function (msg) { callback(msg) },
    error: function (msg) { alert('error : ' + msg.d); }
  });
}

syncJSON("/pathToYourResouce", function (msg) {
   console.log(msg);
})
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.