我有以下代码:
$.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()的调用完成,因为它们依赖于从这些调用返回的信息。每次呼叫都取决于前一次呼叫返回的信息,因此它们必须按此顺序排列。我需要知道所有调用何时完成,以便我可以处理返回的数据。
有没有更简洁的方法来解决这个问题?
答案 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之间进行固有的同步;)