Javascript jQuery Deferred-在运行时将回调添加到延迟合约中

Javascript jQuery Deferred-在运行时将回调添加到延迟合约中,javascript,jquery,jquery-deferred,Javascript,Jquery,Jquery Deferred,我需要的是向jQuery的.when()监视的函数添加未知数量的.pipe()调用(仅在运行时已知)。这些调用将基于另一个异步操作产生的ajax调用。请参阅下面的代码以获得更清楚的解释: $.when( $.ajax({ async: true, success: function (data, textStatus, jqXhr) { console.log('Level 1') for

我需要的是向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!'); });
$。什么时候(
$.ajax({
async:true,
成功:函数(数据、文本状态、jqXhr){
console.log(“级别1”)
对于(变量i=0;i
基本上,1级和3级需要并行执行。2级均基于1级的结果。和级别1,所有级别2和级别3都需要在完成之前执行

使用上述代码不起作用,因为对.pipe()的调用不会影响.when()正在监视的内容

是否可以使用jQuery的延迟框架实现我想要的功能

谢谢你的帮助

注:之前,我问了一个非常类似的问题,但我意识到情况比我在那里说明的要复杂得多,我不想对现有的答案造成混淆


没有那么复杂。如果要并行执行所有级别2调用,只需调用
$。当
.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调用的数量控制在最低限度。

没有那么复杂。如果要并行执行所有级别2调用,只需调用
$。当
.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调用的数量保持在最低限度