【问题标题】:How to set the global array values inside another function call如何在另一个函数调用中设置全局数组值
【发布时间】:2016-08-26 20:49:18
【问题描述】:

我正在使用 ajax 调用从数据库中检索值,然后尝试将这些值插入到数组中(全局声明)。但是在被调用函数之外,如果我试图检查数组的值,它会显示空数组。这是我的代码:

function functionName() {

  var arr1 = [];
  var arr2 = [];

  $(function() {

    $.ajax({
      url: "RandomURL",
      data: {
        some random data
      }
    }).done(
      function(data) {
        console.log(data.data);

        for (var i = 0; i < data.data.length; i++) {
          arr1.push({
            x: data.data[i][0],
            y: data.data[i][1]
          });
          arr2.push({
            x: data.data[i][0],
            y: data.data[i][2]
          });
        }

      });

  });
  console.log(arr1);
  console.log(arr2);

  return [{
    values: arr1,
    key: 'array1 values',
    color: '#ff7f0e'
  }, {
    values: arr2,
    key: 'arr2 values',
    color: '2ca02c'
  }];

}

【问题讨论】:

  • 尝试在 ajax 回调中移动 console.log
  • ajax 是异步的。你不能像那样从 ajax 返回值
  • 你在这里做了什么?你在 functionName() 里面写了 $(function()) ??
  • 你能告诉我如何返回数组值吗?我必须将数组传递给另一个函数以使用 nvd3 库绘制图形

标签: javascript jquery ajax multidimensional-array


【解决方案1】:

只需如下更改,您不需要将这些数组返回到另一个函数,因为您在下面将其声明为全局:

    var arr1 = [];
    var arr2 = [];

    function functionName() { 

    $.ajax({
          url: "RandomURL",
          data: {
            some random data
          }
        }).done(
          function(data) {
            console.log(data.data);

            for (var i = 0; i < data.data.length; i++) {
              arr1.push({
                x: data.data[i][0],
                y: data.data[i][1]
              });
              arr2.push({
                x: data.data[i][0],
                y: data.data[i][2]
              });
            }

          });

      console.log(arr1);
      console.log(arr2);


    }

因此您可以在 plod 数据中分配值,例如:

var plotData = [{
    values: arr1,
    key: 'array1 values',
    color: '#ff7f0e'
  }, {
    values: arr2,
    key: 'arr2 values',
    color: '2ca02c'
  }];

【讨论】:

  • 绘制图形的流程是这样的: nv.addGraph(function() { .... var plotData = functionName(); .... } function functionName() { ... .. 返回 ... }
  • 我已经更新了上面的代码,用于在 plotData 中传递值
  • 根据设置所有其他功能的速度,数组是否设置在根级别,有可能无法及时填充数据。您可能希望通过与数据库的慢速连接来测试它,以确保排除这种情况。但很高兴听到这种变化看起来更好。
【解决方案2】:

您正在返回信息并使用 AJAX 成功之外的控制台日志。 AJAX 在 JQuery 中默认是异步的。您可以在设置中将其设置为 async: false 但通常建议使用异步。

如果您想保持异步,您需要真正完成 ajax 的完成/成功部分中的所有工作。这带来了潜在的问题,因为可能需要更多未封装的全局变量,并在其中调用更多函数以及后续工作。

或者它可能会带你走下承诺的道路,以便在完成 ajax 调用时按后续顺序调用函数。

function callAjax() {
  $.ajax(...

  ...done(function(data) {
    // do work and then
    plotUsingData();
  });
}

function plotUsingData() {
 // now the graph or display of data is created after the content is loaded
}

【讨论】:

    【解决方案3】:

    var arr1 = []; 并没有真正创建全局变量。 arr1 = []; 会。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-17
      • 2017-02-21
      • 2017-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多