Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何执行多个ajax调用并获得结果?_Javascript_Jquery_Ajax - Fatal编程技术网

Javascript 如何执行多个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 = [];

嗨,我想执行一批ajax调用并获得响应,然后为用户呈现结果

我正在使用这段代码,但它不起作用,因为render函数在收集所有ajax响应之前执行

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