0

次のスキームを機能させようとしています: オブジェクトの配列を返す ajax 呼び出しがあります (約束)。これで、他の非同期 ajax 呼び出しを行うなど、配列内の各項目に対して追加の処理を行う関数が成功しました。もちろん、サブ関数が完了する前にメインの success() 関数が返されるため、これは頭痛の種になります。これは私が望んでいることではありません。各サブ関数呼び出しも promise を返します。すべてのアイテムが読み込まれたときにのみメイン関数を終了したいと考えています。

これが私がこれまでに試したことです。メイン関数 getItemData は Q.all(...) が戻るのを待っていません。私はJS AsyncQ.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);
        });
    }
4

1 に答える 1