2

我正在尝试在其状态设置为成功之前向现有 Deferred 的合同添加另一个异步调用。与其尝试用英语解释这一点,不如看下面的伪代码:

$.when(
    $.ajax({        
        url: someUrl,
        data: data,
        async: true,        
        success: function (data, textStatus, jqXhr) {
            console.log('Call 1 done.')
            jqXhr.pipe(
                $.ajax({        
                    url: someUrl,
                    data: data,
                    async: true,        
                    success: function (data, textStatus, jqXhr) {
                        console.log('Call 2 done.');
                    },       
                })
            );
        },       
    }),
    $.ajax({        
        url: someUrl,
        data: data,
        async: true,        
        success: function (data, textStatus, jqXhr) {
            console.log('Call 3 done.');
        },       
    })
).then(function(){ console.log('All done!'); });

基本上,调用 2 取决于调用 1 的结果。我希望调用 1 和调用 3 并行执行。完成所有 3 个调用后,我希望执行 All Done 代码。我的理解是,Deferred.pipe()应该将另一个异步调用链接到给定的延迟,但实际上,我总是在 All Done 之后完成 Call 2。

有谁知道如何让 jQuery 的 Deferred 做我想做的事?希望该解决方案不涉及将代码进一步撕成块。

谢谢你的帮助。

更新:请参阅我的后续问题

4

1 回答 1

4

您必须调用.pipe第一次调用返回的延迟对象$.ajax,而不是在其成功回调中(这根本没有任何效果):

$.when(
    $.ajax({        
        // ...      
    }).pipe(function() {
        // return a deferred object from .pipe
        return $.ajax({        
            // ...      
        });
    }),
    $.ajax({        
        // ...       
    })
).done(function(){ console.log('All done!'); });

.pipe返回一个新的延迟对象,该对象仅在原始延迟对象和返回的对象都被解决后才被解决。

于 2012-09-28T15:39:01.723 回答