예, getJSON
이 비동기이기 때문에 console.log
이 먼저 발생합니다. 코드 은으로 시작하지만 후속 코드가 실행 된 후 나중에 완료됩니다.
처리하려면 getJSON
에서 "완료"콜백을 사용해야합니다. 위의 코드는 시작한 통화 수를 기억하고 계속하기 전에 완료 될 때까지 기다립니다.
또한 populateDataRow
기능들이 모두 마친 알림을받을 jQuery.when
를 사용 후, getJSON
의 반환 값을 반환하는 개체를 저장하고있을 수 있습니다.
다음은 예입니다. Live Copy | 네 통화가 끝나면 우리는 볼 Live Source
var deferreds = [],
index;
for (index = 0; index < 4; ++index) {
deferreds.push($.getJSON("http://jsbin.com/agidot/1", function() {
display("One finished");
}));
}
$.when.apply($, deferreds).then(function() {
display("All finished")
});
function display(msg) {
$("<p>").html(String(msg)).appendTo(document.body);
}
참고 "모두 완료".
$.when
으로 전화하는 것은 약간의 번거 로움입니다. 웬일인지 Deferred
의 배열을 배열에 전달할 수는 없습니다. 그래서 Function#apply
을 사용하여 배열의 각 항목을 개별 인수로 전달합니다.
나는
$.when
배열을 수용하고 유용하게 처리하지 않는 것을 놀랐습니다,하지만 난 여기에 또한
apply
을 사용하는 말을 다른 답변을 참조하십시오
Here 및
Here을. 당신이 많이 배열 사용하려고한다면
, 난 아마 jQuery를 확장 내 표준 툴킷이있을 거라고 생각 :
(function($) {
$.whenAll = function(deferreds) {
return $.when.apply($, deferreds);
};
})(jQuery);
... 다음 코드 예제의 끝이 위의 것 수 :
$.whenAll(deferreds).then(function() {
display("All finished")
});
Ajax 요청의 콜백에서 "완료"메서드를 호출하고 "완료"메서드는 모든 레코드가 검색되었을 때만 수행합니다 (예상 한 레코드 수를 알고있는 경우). – Mansfield