javascript - 将多个 ajax 响应合并到一个数组中

标签 javascript jquery

我有一个项目名称数组,我正在循环并调用下面的函数。我需要将每个 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"
            }
        }]
    }]

我遇到的问题是,当我调用函数来处理完成的数据时,我尝试构建的任何数组似乎都没有完成填充,因此它返回空。除此之外,我不确定我正在做的是什么,寻求帮助。也许异步,或 promise ?需要指出正确的方向。

最佳答案

如果您使用的是转译器,则可以将 async/awaitPromise 一起使用。它使推断代码将如何运行变得更容易。下面的示例说明了您可能如何去做。

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');
    }
   } );
  });
}

关于javascript - 将多个 ajax 响应合并到一个数组中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52031678/

相关文章:

javascript - 谷歌地图的插值方法

javascript - 使用 Stripe & Parse Cloud Code 更新订阅

javascript - Bootstrap 导航栏按钮不切换

jquery - jquery 隐藏/显示内容切换器内的多个 FlexSlider。

javascript - HTML/Javascript 中的行数

javascript - 在 Vue.js 中将子组件输入数据获取到父组件并收集到数组中?

javascript - 建立错误列表

javascript - 在 ruby​​ on rails 中提交 "submit"之前执行 js 代码

javascript - 在 JavaScript 中同步模糊和点击事件

javascript - 使用 href 或按钮运行灯光图库