jQuery Ajax 호출 - 성공 시 변수 값 설정
서버에 캐시된 개체의 데이터를 수정하는 응용 프로그램이 있습니다.변경은 기본적으로 해당 객체의 속성을 업데이트하는 Ajax 호출을 통해 수행됩니다.사용자가 작업을 마치면 기본 'Save Changes(변경 내용 저장)' 버튼이 있으며, 이를 통해 데이터를 저장하고 캐시된 개체를 플러시할 수 있습니다.
사용자를 보호하기 위해 저장되지 않은 서버 오브젝트를 수정했을 때 페이지에서 벗어나려고 할 경우 경고합니다.그래서 IsInitialized라는 웹 서비스 메서드를 만들었습니다.이 메서드는 변경 내용이 저장되었는지 여부에 따라 true 또는 false를 반환합니다.저장되지 않은 경우 사용자에게 안내 메시지를 표시하고 네비게이션 요청을 취소할 수 있는 기회를 주고 싶습니다.
여기 문제가 있습니다.콜은 정상적으로 동작하고 있지만 콜백 함수의 변수 값을 설정하기 위한 ajax 성공 콜을 받을 수 없는 것 같습니다.지금 가지고 있는 암호입니다.
////Catches the users to keep them from navigation off the page w/o saved changes...
window.onbeforeunload = CheckSaveStatus;
var IsInitialized;
function CheckSaveStatus() {
var temp = $.ajax({
type: "POST",
url: "URL.asmx/CheckIfInstanceIsInitilized",
data: "{}",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function(result) {
IsInitialized = result.d;
},
error: function(xmlHttpRequest, status, err) {
alert(xmlHttpRequest.statusText + " " + xmlHttpRequest.status + " : " + xmlHttpRequest.responseText);
}
});
if (IsInitialized) {
return "You currently have unprocessed changes for this Simulation.";
}
}
Success 콜백을 부적절한 방법으로 사용하려고 하는 것 같습니다.저장되지 않은 변경 메시지가 사용자에게 표시될지 여부를 결정할 수 있도록 성공 콜백에 javascript 변수를 설정하려면 어떻게 해야 합니까?
방금 지적한 바와 같이 비동기 호출을 하고 있습니다.즉, 메서드가 반환되기 전에 나머지 코드가 호출됩니다.ajax 콜을 사용하면서도 window.onload 이벤트를 수신할 수 있는 방법이 있습니까?(synchronos ajax를 만들지 않음)
언로드 이벤트에서는 이 동작이 필요하기 때문에 대신 동기 호출을 해야 합니다.단, 호출에 걸리는 시간에 따라 브라우저 창/탭이 정지될 수 있습니다.단, 사용자가 창을 닫지 않도록 효과적으로 노력하고 있기 때문에...
async: false
을 사용하다
jquery 페이지의 예:
var html = $.ajax({
url: "some.php",
async: false
}).responseText;
출처 : http://api.jquery.com/jQuery.ajax/
문제는 Ajax 콜에 대한 요구가 비동기적이라는 것입니다.따라서 IsInitialized를 체크할 때까지 콜은 아직 종료되지 않았습니다.
성공 함수에서 당신의 행동을 명시할 것을 제안합니다.
기본적으로 Ajax와 동기 콜을 하는 것은 불가능하지 않으면 권장되지 않습니다.
이론적으로는 이벤트를 종료하고(return false), 성공 시 창을 닫을 수 있지만, 일부 사용자가 설정한 Javascript 제한에 부딪혀 창이 닫히지 않는 이유에 대해 혼란스러울 수 있습니다.파웰 크라코비악의 말에 동의해요 아약스 호출 자체가 동기화되어야 해요
상태 확인 중임을 사용자에게 알려드립니다(팝업이 아닙니다).창 상단에 있는 알림 배너 중 하나)를 사용하여 $.timeout "displays" 옵션을 이 상황에서 더 합리적인 것으로 설정해 주세요.그러면 창문이 닫힐 때까지 기다릴 필요가 없습니다.
Ajax 요청의 성공 콜백을 통해 데이터 객체의 속성을 설정하려고 할 때도 비슷한 문제가 있었습니다.사용.async: false
제 문제도 해결되지 않았어요.결국 제가 하게 된 것은,setTimeout
다음과 같이 타임아웃 값을 1로 설정합니다.
function getSessionid() {
$.ajax({
type: 'POST',
url: 'getSession.php',
dataType: 'text',
success: function(result){myData.sessionid = result;},
error: function(data) {alert("Error!\n" + data);}
});
setTimeout(function() {alert('sessionid = ' + myData.sessionid);},1);
}
그 1밀리초의 지연이 세상을 크게 변화시켰다.그게 없으면sessionid
속성은 Ajax 콜 외부에 설정되지 않지만 콜백 내의 경보에 의해 실제로 설정되고 있음을 알 수 있습니다.비슷한 문제에 직면하게 되면 생각해 볼 일이다.
가장 좋은 방법은 ajax 콜에서 async: false 옵션을 사용하는 것 같습니다.라삭이 망설이는 것은 이해하지만, 이 상황은 수단을 정당화한다고 생각합니다.
또, 상태를 확인하는 동안, 유저를 행업 상태로 두지 않게 하는 것에 대해서도, Jerph씨의 훌륭한 포인트입니다.타임아웃 옵션과의 결합이 중요합니다.
댓글 달아주신 모든 분들께 감사드립니다.
여기를 참조해 주세요.
http://groups.google.com/group/jquery-dev/browse_thread/thread/40d0e3def47148a0
언급URL : https://stackoverflow.com/questions/709876/jquery-ajax-call-set-variable-value-on-success
'programing' 카테고리의 다른 글
모든 도메인을 받아들이도록 Access-Control-Allow-Origin을 설정할 경우 어떤 보안 위험이 있습니까? (0) | 2023.03.08 |
---|---|
정의하다WP_DEBUG', true), 오류는 표시되지 않습니다. (0) | 2023.03.08 |
Wordpress 로그인 이름으로 사용자 ID 가져오기 (0) | 2023.03.08 |
LogBack을 사용한 SpringBoot에서 LOG_PATH_IS_UNDEFINED 폴더 생성 (0) | 2023.02.26 |
약속 체인에서의 set Timeout 사용 (0) | 2023.02.26 |