다음 코드가 있습니다.
function f(){
var value = "";
var request1 = $.ajax({
url : '/a',
type: "GET"
});
var request2 = $.ajax({
url: '/b',
type: 'GET',
});
$.when(request1, request2).done(function(result1, result2){
//break point #1
//result1 = [Object, "success", Object]
//result2 = [Object, "success", Object]
//do something
})
//break point #2
//request1 = Object {readyState: 1}
//request2 = Object {readyState: 1}
return value
}
내가 한 장소에서 중단 점을 result1 = [Object, "success", Object]
벗어나면 나는 그것을 얻고 다른 장소에서 그것을 나가면 나는 그것을 얻습니다 request1 = Object {readyState: 1}
. 위를 참조하십시오.
a = f()
. 콜백으로해야 할 일입니까? 나는 그것에 관한 기사를 읽으려고 노력했지만 그것을 구현하지 못했기 때문에 도움을 받고 싶습니다. 자바 스크립트에 대한 경험이 많지 않아서 아직 구현하기 어려운 부분이 있습니다.예, 이는 비동기 기능 때문입니다. 결과를 확인하든 반환 값을 변수에 서명하든 호출이 반환 된 후 실행하려는 모든 코드는 콜백 내에 배치되어야합니다. 중단 점 # 2에서는 비동기 호출을 '스텝 오버'하고 있으며이 호출의 상태를 제어 할 수 없습니다. 따라서 모든 코드를 콜백에, 즉 중단 점 1에 배치하십시오.
'f'함수의 결과를 변수에 할당하려면 (예 : var r = f (), 비동기 ajax 호출에 따라 f를 사용하려면 jQuery의 Deferred 객체를 사용하여 'f'함수를 비동기 함수로 전환해야합니다.) 또는 약속에 내장 된 ES6를 사용합니다. 이렇게 하면 모든 ajax 요청이 해결되는 f가 해결 될 때 f의 결과를 할당 할 수 있습니다 .
다음 코드 스 니펫에서는 작동 스 니펫으로 변환하기 위해 비동기 함수로 대체하여 ajax 호출을 시뮬레이션했습니다. 나는 f가 Deferred 객체를 반환하도록함으로써 비동기 함수로도 바꿨습니다.
$(document).ready(function() {
function f() {
var value = $.Deferred(); //this is the result this function will return
//simulate ajax call 1
var request1 = function() {
var result = $.Deferred();
result.resolve("this is the result of request 1");
//result.reject("something went wrong in request 1");
return result;
};
//simulate ajax call 2
var request2 = function() {
var result = $.Deferred();
result.resolve("this is the result of request 2");
//result.reject("something went wrong in request 2");
return result;
};
$.when(request1(), request2()).done(function(result1, result2) {
alert("result 1: " + result1);
alert("result 2: " + result2);
value.resolve(result1 + ' ' + result2); //assuming the result of the f function is a concatenation of both requests
}).fail(function(err) {
alert("error occurred while executing request 1 or 2: " + err);
value.reject(err);
});
return value;
}
//call f function. Asign result asynchronously
$.when(f()).done(function(result) {
//f has 'resolved'
alert("result of f: " + result);
}).fail(function(err) {
alert("error while executing f: " + err);
});
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다