次のスキームを機能させようとしています: オブジェクトの配列を返す ajax 呼び出しがあります (約束)。これで、他の非同期 ajax 呼び出しを行うなど、配列内の各項目に対して追加の処理を行う関数が成功しました。もちろん、サブ関数が完了する前にメインの success() 関数が返されるため、これは頭痛の種になります。これは私が望んでいることではありません。各サブ関数呼び出しも promise を返します。すべてのアイテムが読み込まれたときにのみメイン関数を終了したいと考えています。
これが私がこれまでに試したことです。メイン関数 getItemData は Q.all(...) が戻るのを待っていません。私はJS AsyncとQ.jsライブラリを使用しています:
function main() {
//performs an ajax get to grab items from server
return data.getItems().then(succeeded).fail(failed);
}
function succeeded(d) {
async.each(d.results, getItemData, function (err) { logger.logError(err) });
function getItemData(item, callback) {
//counts
item.totalSubItems = ko.observable(0);
Q.all([getCounts, getLastSubItem]).then(function fulfilled() {
items.push(item);
return callback;
});
};
function getCounts() {
//another ajax call that returns a promise
data.getItemCounts(item.id()).then(function (c) {
var results = c.results;
//some work
})
.fail(function (error) {
logger.logError(error);
});
function getLastSubItem() {
//also returns a promise
data.getLastSubItem(item.id()).then(function (sub) {
item.lastsub(sub.results[0]);
})
.fail(function (error) {
logger.logError(error);
});
}