链接多个jQuery ajax请求
Chaining multiple jQuery ajax requests
我有以下代码:
$.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传输之间实现固有的同步;)
相关文章:
- ajax请求的顺序总是不同的
- 从ajax请求中获取javascript对象
- Ajax请求文档就绪会导致jquery加载缓慢
- MockJax没有在JavaScript应用程序中发送对我AJAX请求的响应
- 正在传递JSONP标头's数据参数到另一个文件中的AJAX请求
- JavaScript代码未正确检查ajax请求
- "日期“;AJAX请求返回的类型值未定义
- 在等待ajax请求时显示微调器并禁用页面
- 跨域ajax请求
- Ajax请求返回空的数据字符串,但首先得到了正确的数据
- Javascript-如何让脚本与Ajax请求的数据一起运行
- ajax请求成功,但可以'我看不到我的数据
- 如何将给定的curl命令复制为jquery ajax请求
- 为什么我能够从javascript控制台发送跨域ajax请求
- 一台特定计算机的Ajax请求数据未定义/失败
- 获取ajax请求的请求头
- 原型Ajax请求参数为嵌套json
- 可以't从AJAX请求中筛选数据
- jQuery Mobile Collapse上的AJAX请求
- 暂停函数执行流程,直到ajax请求完成