多くのリモートリソースがロードされ、最終的なコールバックを実行します(これらの要求から取得データに基づいて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を使用してを使用して、本当にきれいな解決策です' - 問題は、あなたが指摘したような非同期要求は順番に発生しないので、要求が最後のものかどうかを調べるのではなく、*応答*が最後のものかどうかを確認する必要があります –
HTTPリクエストが終了すると終了します。保証された注文はありません。自分のカウンタを保持し、 "成功"コールバックでそれをインクリメントして、最後の応答をいつ処理するかを知ることができます。 – Pointy
@Pointy 'ResourceLoader'では、提供された成功コールバックにカウンタチェックを注入する必要がありますか?私は 'ResourceLoader'がこれを処理します。 –