2013-05-09 1 views
2

여기 내 코드의 일부입니다 : 여기 populateDataRowgetJSON 명령어의 배치가 완료 될 때만 어떻게 트리거합니까?

for (var i = 0; i < recordList.length; i++) { 
    var recordID = recordList[i]; 
    populateDataRow(i, recordID, columns) 
}; 
console.log("done"); 

populateDataRow 사이클이 완료되기 전에 (Google 크롬 이상에서)는 console.log 문이 긴 트리거되는 문제가 $.getJSON 를 사용하는 기능입니다

+0

Ajax 요청의 콜백에서 "완료"메서드를 호출하고 "완료"메서드는 모든 레코드가 검색되었을 때만 수행합니다 (예상 한 레코드 수를 알고있는 경우). – Mansfield

답변

4

예, 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을 사용하는 말을 다른 답변을 참조하십시오 HereHere을. 당신이 많이 배열 사용하려고한다면

, 난 아마 jQuery를 확장 내 표준 툴킷이있을 거라고 생각 :

(function($) { 
    $.whenAll = function(deferreds) { 
     return $.when.apply($, deferreds); 
    }; 
})(jQuery); 

... 다음 코드 예제의 끝이 위의 것 수 :

$.whenAll(deferreds).then(function() { 
    display("All finished") 
}); 
+2

매우 잘 설명되어 있습니다 :) – GNi33

+1

매우 포괄적이고 멋진 답변! 나는 오늘의 나머지 시간 동안 이것에 대해 열중하고있을 것이다, 고마워! –

+0

@ 잭 : 환영합니다. 다행했습니다. –

0

$.getJSON는 jQuery의 $.ajax() α- 함수에 대한 속기 기능입니다. XHR (또는 AJAX) 호출이 비동기이며, 다른 코드가 더 실행되면 AJAX 호출이 완료 될 때 실행되는 콜백 함수를 제공해야합니다. 이 API (http://api.jquery.com/jQuery.getJSON/)

$.getJSON('ajax/test.json', function(data) { 

}); 
여기

, function(data){} 가입일

getJSON는 인수에 제공 콜백 함수이다. 반환 된 데이터를 사용하여 작업하려면이 함수에서 수행하거나이 함수를 실행해야합니다.

+0

예제에서 보여주지는 않았지만 콜백은 이미 사용 중입니다. 내 문제는 getJSON 명령이 여러 번 호출되었고 _last_ 하나가 실행될 때만 알고 싶다는 것이 었습니다. –

관련 문제