javascript - 将多个 ajax 响应合并到一个数组中
问题描述
我有一个项目名称数组,我正在循环并调用下面的函数。我需要将每个 ajax 调用的结果添加到主数组中,但我不确定如何实现。理想情况下,我还会显示一条加载消息(使用 jquery 在完成后显示/隐藏,然后显示数据),但我不确定从哪里开始。
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"
}
}]
}]
我遇到的问题是,当我调用函数来处理完成的数据时,似乎我尝试构建的任何数组都没有完成填充,因此它返回空。除此之外,我不确定我正在做什么,以寻求帮助。也许是异步的,还是承诺?需要指出正确的方向。
解决方案
如果您使用的是转译器,则可以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');
}
} );
});
}
推荐阅读
- spring-boot - 关闭 Kafka 侦听器使 JVM 退出
- spring-webflux - 如何测试 EmitterProcessor 是否从 RestController 接收和发出消息?
- python - 如何找到字符串中具有多个“孔”的所有可能排列?
- css - 如何在 ui Material Textfield 中应用我自己的 css 样式?
- git - 无法完成github分享过程
- python - 如何使用 Django Channels 发送 websocket 延迟组消息?
- java - 批量重命名 JAX 绑定文件中的 complexType 元素,即 bindings.xjb?
- elisp - 我需要我的函数使用 LISP while 循环和欧几里得算法返回给定输入的 GCD 我得到的输出是 0
- sql - 更新表时触发重新运行 SQL 查询
- debugging - 调试:无法将预期类型“GHC.Types.Bool”与实际类型“Bool”匹配