많은 리소스를로드 한 다음 이러한 요청에서 데이터를 검색하여 DOM을 렌더링하는 것처럼 최종 콜백을 실행하면 리소스 로더가 필요합니다.최종 콜백, 신뢰할 수없는 주문이있는 많은 요청이 있습니까?
다음은 함수의 :
var ResourceLoader = function() {
this.requests = new Array();
this.FinalCallback;
this.Add = function (request) {
this.requests.push(request);
};
this.Execute = function() {
for (var x = 0; x < this.requests.length ; x++) {
var success = this.requests[x].success;
//if this is the last of the requests...
if (x == (this.requests.length - 1) && this.FinalCallback) {
$.when($.ajax({
url: this.requests[x].url,
dataType: 'json',
error: this.requests[x].error,
method: 'GET'
}).done(success)).then(this.FinalCallback);
}
else {
$.ajax({
url: this.requests[x].url,
dataType: 'json',
error: this.requests[x].error,
method: 'GET'
}).done(success);
}
}
};
};
그리고 여기 내가 사용하는 방법은 다음과 같습니다
var apiUrl = Utilities.Api.GetWebApiUrl();
var loader = new Utilities.ResourceLoader();
loader.Add({
url: apiUrl + 'regions/get',
success: function (results) {
Filters.Regions = results;
}
});
loader.Add({
url: apiUrl + 'currentfactors/get/83167',
success: function (results) {
Filters.NbrEmployees = results;
}
});
loader.Add({
url: apiUrl + 'currentfactors/get/83095',
success: function (results) {
Filters.Industries = results;
}
});
loader.FinalCallback = RenderBody;
loader.Execute();
function RenderBody() {
console.log('render...');
}
을 분명히, 나는 RenderBody
가 마지막으로 실행 될 것으로 기대하고있다. 하지만 그건 무슨 일이 아니야. 아이러닉 한 점은 이전에 그런 식으로 일하는 것을 기억하지만 코드를 잃어버린 것입니다 ... 내가 뇌간을 가지고있는 것처럼 보입니다.
'내가 RenderBody를 기다리고있을 때 jQuery를 사용하여
Promise.all
나 ...를 사용하는 정말 깨끗한 솔루션입니다 '문제는, 당신이 지적한 것처럼, 비동기 요청은 순차적으로 발생하지 않기 때문에 요청이 최종 것인지 아닌지 확인하기보다는 응답 *이 최종 것인지 확인하십시오 –
HTTP 요청이 끝나면 끝납니다. 보증 된 주문이 없습니다. 자신의 카운터를 유지하고 "성공"콜백에서 증가시켜 최종 응답을 처리하는 시점을 알 수 있습니다. – Pointy
@Pointy 그래서'ResourceLoader'에서 제공되는 성공 콜백에 카운터 체크를 주입해야합니까? 나는 이것을 처리하기 위해'ResourceLoader'를 원한다. –