链接多个jQuery ajax请求

JFo*_*kes 5 javascript jquery refactoring

我有以下代码:

$.when(loadProjects())
    .then(function() {

        $.when.apply($, buildRequests(projects))
        .then(function(data) {

            $.when.apply($, vcsRequests(buildTypes))
            .then(function(data) {

                $.when.apply($, vcsDetailRequests(vcsRoots))
                .then(function(data) {
                    alert('done');
                });

            });

        });

    });
Run Code Online (Sandbox Code Playgroud)

传递给when.apply()的每个函数都返回请求数组.我无法执行buildRequests调用,直到来自loadProjects()的调用完成,因为它们依赖于从这些调用返回的信息.每次呼叫都取决于前一次呼叫返回的信息,因此它们必须按此顺序排列.我需要知道所有调用何时完成,以便我可以处理返回的数据.

是否有更清洁的方法来解决这个问题?

Sup*_*upr 2

前几天我遇到了yepnope.js 。我自己还没有尝试过,但如果您正在进行大量 ajax 加载,它可能会有所帮助。


实际上仔细思考这一点让我意识到 yepnope.js 并不真正适用于您的情况。在您的情况下,我会考虑让et al 通过在每个函数内部loadProjects()应用来返回一个承诺。when()另外pipe()使用可能会导致类似的情况

loadProjects().pipe(buildRequests).pipe(vcsRequests).pipe(vcsDetailRequests);
Run Code Online (Sandbox Code Playgroud)

样本buildRequests()

function buildRequests(projects){
    // Do something using projects
    // ...

    var requestsPromise = ...; // Finally get ajax promise for requests
    return requestPromise;
}
Run Code Online (Sandbox Code Playgroud)

requestPromise一旦解决/拒绝,结果将被传递到下一个管道函数。


从文档中pipe()

// Example: Chain tasks: 

var request = $.ajax( url, { dataType: "json" } ),
    chained = request.pipe(function( data ) {
      return $.ajax( url2, { data: { user: data.userId } } );
    });

chained.done(function( data ) {
  // data retrieved from url2 as provided by the first request
});
Run Code Online (Sandbox Code Playgroud)