Javascript 如何执行多个ajax调用并获得结果?
嗨,我想执行一批ajax调用并获得响应,然后为用户呈现结果 我正在使用这段代码,但它不起作用,因为render函数在收集所有ajax响应之前执行Javascript 如何执行多个ajax调用并获得结果?,javascript,jquery,ajax,Javascript,Jquery,Ajax,嗨,我想执行一批ajax调用并获得响应,然后为用户呈现结果 我正在使用这段代码,但它不起作用,因为render函数在收集所有ajax响应之前执行 serviceQuery: function (id) { return $.getJSON(SERVICEURL + "/", id); }, queryService: function(data){ var self = this; var queries = []; var results = [];
serviceQuery: function (id) {
return $.getJSON(SERVICEURL + "/", id);
},
queryService: function(data){
var self = this;
var queries = [];
var results = [];
$.each(data, function (index, value) {
queries.push(self.serviceQuery(value.id));
});
$.when(queries).done(function (response) {
$.each(response, function (index,val) {
val.then(function (result){
results.push(result[0]);
});
});
self.renderResult(results);
});
},
renderResult: function(results){
$.each(results, function (index, value) {
///Error here cause the value.Name is undefined
console.info(value.name);
});
}
您知道如何在执行渲染函数之前等待所有ajax调用完成吗?将
$更改为for
循环。在循环完成之前,值上的.then
可能未完成处理<代码>$。每个
都是同步的,但是。那么
通常意味着它是一个承诺,而不是同步的
$.each(response, function (index,val) {
val.then(function (result){
results.push(result[0]);
});
});
也改变
for(var idx = 0; idx < response.length; idx++) {
results.push(response[idx]);
}
将
$.each
更改为for
循环。在循环完成之前,值上的.then
可能未完成处理<代码>$。每个都是同步的,但是。那么
通常意味着它是一个承诺,而不是同步的
$.each(response, function (index,val) {
val.then(function (result){
results.push(result[0]);
});
});
也改变
for(var idx = 0; idx < response.length; idx++) {
results.push(response[idx]);
}
我在这里看到一个潜在问题:
$.when(queries).done(function (response) {
$.each(response, function (index,val) {
val.then(function (result){
results.push(result[0]);
});
});
self.renderResult(results);
});
基本上,您的伪代码是这样说的:
对于$.when()命令中的每个返回值,获取该值并返回一个新承诺(通过val.then
)。但是,由于您从不等待val延迟运行,results.push
不能保证在调用self.renderResult(results)
之前被调用
$.each(response, function (index,val) {
results.push(val[0]);
});
代码在我看来很奇怪,因为ajax调用需要两个嵌套的延迟。因此,我认为一个更大的元问题是,为什么首先需要执行val。但是,根据当前代码,您需要执行以下操作:
var innerDeferreds = [];
$.each(response, function (index,val) {
innerDeferreds.push(val.then(function (result){
results.push(result[0]);
}));;
});
$.when(innerDeferreds).then(function() { self.renderResult(results); });
同样,我的猜测是,您首先不需要val.then
,但我需要在调试器中查看response
、index
和val
的值是什么。(如果您设置了一个非常有用的JSFIDLE!)我在这里看到了一个潜在的问题:
$.when(queries).done(function (response) {
$.each(response, function (index,val) {
val.then(function (result){
results.push(result[0]);
});
});
self.renderResult(results);
});
基本上,您的伪代码是这样说的:
对于$.when()命令中的每个返回值,获取该值并返回一个新承诺(通过val.then
)。但是,由于您从不等待val延迟运行,results.push
不能保证在调用self.renderResult(results)
之前被调用
$.each(response, function (index,val) {
results.push(val[0]);
});
代码在我看来很奇怪,因为ajax调用需要两个嵌套的延迟。因此,我认为一个更大的元问题是,为什么首先需要执行val。但是,根据当前代码,您需要执行以下操作:
var innerDeferreds = [];
$.each(response, function (index,val) {
innerDeferreds.push(val.then(function (result){
results.push(result[0]);
}));;
});
$.when(innerDeferreds).then(function() { self.renderResult(results); });
同样,我的猜测是,您首先不需要val.then
,但我需要在调试器中查看response
、index
和val
的值是什么。(如果您设置了一个非常有用的JSFIDLE!)使用.apply()
at$.when()
调用来处理Promise
的数组。还要注意,.then()
异步返回结果
let查询=[
//`$.ajax()`调用和响应
新的递延美元(功能(dfd){
setTimeout(dfd.resolve,Math.floor(Math.random()*1000)
//响应,文本状态,jqxhr
,[{name:“a”},“success”,{}])
})
//`$.ajax()`调用和响应
,新的美元递延(功能(dfd){
setTimeout(dfd.resolve,Math.floor(Math.random()*1000)
//响应,文本状态,jqxhr
,[{name:“b”},“success”,{}])
})
];
$.when.apply(空,查询)
.然后(函数(){
renderResult($.map(参数,函数(res){return res[0]}));
});
函数renderResult(结果){
$.each(结果、函数(索引、值){
console.info(value.name);
});
}
使用.apply()
at$。when()
调用来处理Promise
的数组。还要注意,.then()
异步返回结果
let查询=[
//`$.ajax()`调用和响应
新的递延美元(功能(dfd){
setTimeout(dfd.resolve,Math.floor(Math.random()*1000)
//响应,文本状态,jqxhr
,[{name:“a”},“success”,{}])
})
//`$.ajax()`调用和响应
,新的美元递延(功能(dfd){
setTimeout(dfd.resolve,Math.floor(Math.random()*1000)
//响应,文本状态,jqxhr
,[{name:“b”},“success”,{}])
})
];
$.when.apply(空,查询)
.然后(函数(){
renderResult($.map(参数,函数(res){return res[0]}));
});
函数renderResult(结果){
$.each(结果、函数(索引、值){
console.info(value.name);
});
}
Read Promissions..Promission非常适合这里,你可以使用promise。这里的所有人都读了很多遍,但都没有找到一个具体的例子来说明如何使用promise,这就是我寻求帮助的原因。你试过使用回调函数吗?Read Promissions..promise非常适合这里,你可以使用promise。这里的所有人都读了很多遍,没有找到一个具体的例子来说明如何做,这就是为什么我寻求帮助。你试过使用回调函数吗?让我试试这个让我试试这个我试着使用这个问题的解法,对我来说使用double也很奇怪,但是如果你不使用它,就没有其他方法可以得到API的响应嗨,我试着使用这个问题的解决方案,对我来说,使用double then也很奇怪,但是如果你不使用它,就没有其他方法可以得到API的响应,因为箭头函数不完全受支持,让我进行反转换,但您的示例看起来不错。我进行了更改,但现在我只得到查询数组的一个结果,而不是所有结果。@DeividKamui是否在中包含rest参数…response
。然后()?您也可以使用.then(function(){let response=$.makeArray(arguments)})
这是我对代码的更改,我们可以开始聊天吗?$。when.apply(null,查询).th