source

JavaScript: Ajax 요청 후 글로벌 변수

itover 2023. 3. 28. 21:41
반응형

JavaScript: Ajax 요청 후 글로벌 변수

질문은 매우 간단하고 기술적인 것입니다.

var it_works = false;

$.post("some_file.php", '', function(data) {

     it_works = true;

});

alert(it_works); # false (yes, that 'alert' has to be here and not inside $.post itself)

내가 달성하고 싶은 것은:

alert(it_works); # true

그렇게 할 수 있는 방법이 있나요?할 수 없는 경우$.post()적용할 값을 반환하다it_works?

필요한 것은 동기(블로킹) 유형의 요구입니다.

var it_works = false;

jQuery.ajax({
  type: "POST",
  url: 'some_file.php',
  success: function (data) {
    it_works = true;
  }, 
  async: false // <- this turns it into synchronous
});​

// Execution is BLOCKED until request finishes.

// it_works is available
alert(it_works);

기본적으로 요청비동기(비차단)이며, 브라우저는 작업을 계속하기 위해 요청이 완료될 때까지 기다리지 않습니다.그래서 네 경고 결과가 잘못된 거야.

이제 필요에 따라 요청을 동기화할 수 있습니다.즉, 요청이 완료된 후에만 스크립트가 계속 실행됩니다.


, 권장되는 방법은 요청이 완료되는 즉시 데이터가 콜백 함수에 전달되도록 코드를 리팩터링하는 것입니다.실행 차단은 UI를 차단하는 것을 의미하므로 이 방법이 선호됩니다.다음과 같이 합니다.

$.post("some_file.php", '', function(data) {
    iDependOnMyParameter(data);
});

function iDependOnMyParameter(param) {
    // You should do your work here that depends on the result of the request!
    alert(param)
}

// All code here should be INDEPENDENT of the result of your AJAX request
// ...

비동기 프로그래밍은 요구를 하는 결과가 요구문을 따르는 대신 함수에 캡슐화되기 때문에 약간 더 복잡하다.그러나 느린 서버나 느린 네트워크를 볼 수 없기 때문에 사용자가 경험하는 실시간 동작은 브라우저가 크래쉬한 것처럼 동작합니다.동기 프로그래밍은 무례하며 사람들이 사용하는 응용 프로그램에 사용해서는 안 됩니다.

더글러스 크록포드 (YUI 블로그)

AJAX는 Asynchronous JavaScript와 XML의 약자입니다.따라서 서버에 대한 투고는 나머지 함수와 동기화되지 않습니다.대신 이와 같은 코드를 사용해 보십시오(속기가 깨질 뿐입니다).$.post장기에 걸쳐서$.ajax를 호출하여 추가합니다.async옵션)을 클릭합니다.

var it_works = false;

$.ajax({
  type: 'POST',
  async: false,
  url: "some_file.php",
  data: "",
  success: function() {it_works = true;}
});

alert(it_works);

이게 도움이 됐으면 좋겠네요!

당신의 문제는 단순히 동시성 문제인 것 같습니다.post 함수는 callback 인수를 사용하여 투고가 완료된 시간을 알려줍니다.이와 같이 글로벌 범위에서 경고를 만들 수 없으며 게시물이 이미 완료되었다고 기대할 수 없습니다.콜백 기능으로 이동해야 합니다.

는 " " " 입니다.post()는 서버에 대한 비동기 요구를 시작합니다.그게 당신에게 의미하는 것은post()는 예상대로 요구가 완료된 후가 아니라 즉시 반환됩니다.

따라서 요청이 동기화되어 요청이 완료될 때까지 현재 스레드를 차단해야 합니다.따라서,

var it_works = false;

$.ajax({
  url: 'some_file.php',
  async: false,  # makes request synchronous
  success: function() {
    it_works = true;
  }
});

alert(it_works);

언급URL : https://stackoverflow.com/questions/3222347/javascript-global-variables-after-ajax-requests

반응형