Javascript 将多个ajax响应合并到单个阵列中
我有一个项目名称数组,我正在循环并调用下面的函数。我需要将每个ajax调用的结果添加到主数组中,但我不确定如何实现这一点。理想情况下,我也会显示一条加载消息(完成时使用jquery显示/隐藏,然后显示数据),但我不确定从哪里开始Javascript 将多个ajax响应合并到单个阵列中,javascript,jquery,Javascript,Jquery,我有一个项目名称数组,我正在循环并调用下面的函数。我需要将每个ajax调用的结果添加到主数组中,但我不确定如何实现这一点。理想情况下,我也会显示一条加载消息(完成时使用jquery显示/隐藏,然后显示数据),但我不确定从哪里开始 var list = ["node1","node2","node3"] var items = []; $.each(list, function( index, value ) { getNodes(value.name); }); function ge
var list = ["node1","node2","node3"]
var items = [];
$.each(list, function( index, value ) {
getNodes(value.name);
});
function getNodes(name) {
jQuery.ajax( {
url: 'http://url.com' + name + '/endpoint',
method: 'GET',
dataType: 'json',
success: function ( data, textStatus, jqXHR ) {
if ( data.length > 0 ) {
jQuery.each( data, function event( key, value ) {
var info = [];
info.name = name;
info.address = this.address;
info.node = this.node.data;
items = $.extend(items[name],info);
} );
}
},
error: function ( jqXHR, textStatus, errorThrown ) {
alert( 'An error has occured!' );
}
} );
}
我的最终目标是拥有一个数组/对象,我可以(一旦完成)在javascript/jquery中循环并处理该数据
[{
"node1": [{
"node1a": {
"name": "node1",
"address": "192.168.1.4",
"node": "somedata"
},
"node1b": {
"name": "node1",
"address": "192.168.1.5",
"node": "somedata"
},
"node1c": {
"name": "node1",
"address": "192.168.1.6",
"node": "somedata"
}
}],
"node2": [{
"node2a": {
"name": "node1",
"address": "192.168.1.7",
"node": "somedata"
},
"node2b": {
"name": "node1",
"address": "192.168.1.8",
"node": "somedata"
},
"node2c": {
"name": "node1",
"address": "192.168.1.9",
"node": "somedata"
}
}],
"node3": [{
"node3a": {
"name": "node1",
"address": "192.168.1.10",
"node": "somedata"
},
"node3b": {
"name": "node1",
"address": "192.168.1.11",
"node": "somedata"
},
"node3c": {
"name": "node1",
"address": "192.168.1.12",
"node": "somedata"
}
}]
}]
我遇到的问题是,当我调用函数来处理完成的数据时,似乎我试图构建的任何数组都没有完成填充,因此它返回空。除此之外,我不确定我正在做的是什么,寻找帮助。可能是异步的,还是承诺的?需要指出正确的方向。如果您使用的是transpiler,您可以使用
async/await
和Promise
。这使得我们更容易对代码的行为进行推理。下面的例子说明了您可以如何着手进行
for(let x = 0; x < list.length; x++) {
const result = await getNodes(list[x]);
items.push(result);
}
function async getNodes(name) {
const url = 'http://url.com' + name + '/endpoint';
return await ajaxCall(url);
}
function ajaxCall(url) {
return new Promise((resolve, reject) => {
jQuery.ajax( {
url: url,
method: 'GET',
dataType: 'json',
success: function ( data, textStatus, jqXHR ) {
resolve(data);
},
error: function ( jqXHR, textStatus, errorThrown ) {
reject('error');
}
} );
});
}
for(设x=0;x{
jQuery.ajax({
url:url,
方法:“GET”,
数据类型:“json”,
成功:函数(数据、文本状态、jqXHR){
解析(数据);
},
错误:函数(jqXHR、textStatus、errorshown){
拒绝(“错误”);
}
} );
});
}
在这种情况下,AJAX
调用必须是同步的
,然后只有您才能合并它们的结果。我想知道是否有其他方法可以实现这一点。请发布您的代码,以便它也包含您处理完成数据的位置。事实上,由于ajax是异步的,您需要使用Promissions(或async/await),以便知道所有异步调用何时完成。您使用的是array,因为您的意思是使用常规对象,例如info
应该是一个对象,因为您没有向其添加元素,而只是对象属性。另外,items[name]
如果name
不是某个数字,那么您不是在设置/访问数组元素,而是在访问某个对象属性。jQuery.ajax
已经返回了一个类似于承诺的对象-我很确定不需要将其包装成另一个。我不确定是否可以将wait
与jQuery的类似承诺的类型一起使用。但是是的,如果可以的话,你可以退货。