1

必要なのは、jQueryの.when()によって監視されている関数に不明な数(実行時にのみ認識される)の.pipe()呼び出しを追加することです。これらの呼び出しは、別の非同期操作の結果として行われたajax呼び出しに基づいています。より明確な説明については、以下のコードを参照してください。

$.when(
    $.ajax({ 
        async: true,        
        success: function (data, textStatus, jqXhr) {
            console.log('Level 1')

            for(var i = 0; i < data.length; i++)
                jqXhr.pipe(
                    $.ajax({  
                        data: data[i],                                                              
                        async: true,        
                        success: function (data, textStatus, jqXhr) {
                            console.log('Level 2');
                        },       
                    })
                );
        },       
    }),
    $.ajax({
        async: true,        
        success: function (data, textStatus, jqXhr) {
            console.log('Level 3');
        },       
    })
).done(function(){ console.log('All done!'); });

基本的に、レベル1とレベル3は並行して実行する必要があります。レベル2はすべてレベル1の結果に基づいています。また、レベル1、すべてのレベル2とレベル3は、すべてが完了する前に実行する必要があります。

.pipe()の呼び出しは、.when()が監視しているものに影響を与えないため、上記のコードを使用しても機能しません。

jQueryのDeferredフレームワークでやりたいことをすることは可能ですか?

助けてくれてありがとう。

注:以前、非常によく似た質問をしましたが、状況はそこに示したものよりもはるかに複雑であり、既存の回答と混同したくありませんでした。

元の質問

4

1 に答える 1

1

それほど複雑ではありません。レベル2のすべての呼び出しを並行して実行する場合は$.when、コールバック内で呼び出して、.pipeその遅延オブジェクトを返します。

$.when(
    $.ajax({        
        // ...      
    }).pipe(function(data) {
        // concise way to make the Ajax calls for each value
        var deferreds = $.map(data, function(value) {
            return $.ajax({data: value, /*...*/});
        });
        return $.when.apply($, deferreds);
    }),
    $.ajax({        
        // ...       
    })
).done(function(){ console.log('All done!'); });

それらを順番に実行したい場合は、.pipeもう一度使用してください。

$.when(
    $.ajax({        
        // ...      
    }).pipe(function(data) {
        // A "dummy" resolved deferred object 
        var deferred = (new $.Deferred()).resolve();
        $.each(data, function(value) {
            deferred = deferred.pipe(function() {
                return $.ajax({data: value, /*...*/});
            });
        });
        return deferred;
    }),
    $.ajax({        
        // ...       
    })
).done(function(){ console.log('All done!'); });

ただし、Ajax呼び出しの数を最小限に抑える必要があると言わざるを得ません。

于 2012-09-28T18:03:27.830 に答える