链接多个jQuery ajax请求

Chaining multiple jQuery ajax requests

本文关键字:ajax 请求 jQuery 链接      更新时间:2023-09-26

我有以下代码:

$.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()的每个函数都返回请求数组。在loadProjects()的调用完成之前,我无法执行buildRequest调用,因为它们依赖于这些调用返回的信息。每个调用都取决于上一个调用返回的信息,因此它们必须按此顺序。我需要知道所有调用何时完成,这样我才能处理返回的数据。

有没有更干净的方法来处理这个问题?

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


事实上,仔细想想让我意识到yepnope.js并不真正适用于您的情况。在您的情况下,我会考虑让loadProjects()等人通过在每个函数中内部应用when()来返回一个promise。此外,使用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
});

AJAX请求的依赖链:您可以链接多个AJAX请求—例如,第一个调用检索用户的用户详细信息,我们需要将该值传递给第二个脚本。请记住,$.then()返回一个新的promise,该promise随后可以传递给$.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);
});

。。。。根据我对原始帖子的评论:

看来你有很多请求要连锁。然后我会考虑将所有请求合并为一个请求。。。。比正在链接。。。

这样的东西:

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传输之间实现固有的同步;)