链接多个jQuery ajax请求

时间:2012-02-10 09:56:08

标签: 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');
                });

            });

        });

    });

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

有没有更简洁的方法来解决这个问题?

3 个答案:

答案 0 :(得分:2)

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


实际上想到这一点让我意识到yepnope.js并不适用于你的情况。在您的情况下,我要考虑的是让loadProjects()等通过在每个函数内部应用when()来返回单个承诺。同时使用pipe()可能会导致类似

的内容
loadProjects().pipe(buildRequests).pipe(vcsRequests).pipe(vcsDetailRequests);

示例buildRequests()

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

    var requestsPromise = ...; // Finally get ajax promise for requests
    return requestPromise;
}

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
});

答案 1 :(得分:2)

AJAX请求的依赖链:您可以链接多个AJAX请求 - 例如,第一次调用检索用户的用户详细信息,我们需要将该值传递给第二个脚本。请注意,$.then()会返回一个新的承诺,随后可以将其传递给$.done()或其他$.then()方法。

var a1 = $.ajax({
             url: '/first/request/url',
             dataType: 'json'
         }),
    a2 = a1.then(function(data) {
             // .then() returns a new promise
             return $.ajax({
                 url: '/second/request/url',
                 dataType: 'json',
                 data: data.userId
             });
         });

a2.done(function(data) {
    console.log(data);
});

答案 2 :(得分:1)

....根据我对原帖的评论回复:

  

似乎你有很多链接请求。我会考虑一下   将所有请求合并为单个请求....效率更高   链接...

嗯,这样的事情:

PHP:
$projects = YourAPI::loadProjects();
$builds = YourAPI::getBuilds($projects);
$vcs = YourAPI::getVCS($builds);
$details = YourAPI::getVCSDetails($vcs);

// for example
return json_encode($details);

// OR, if you need all the data
$results = array( 
    "projects" => $projects,
    "builds" => $builds,
    "vsc" => $vcs,
    "details" => $details
);
return json_encode($results);

这样,你就可以在调用和更少的HTTP trafiic之间进行固有的同步;)

相关问题