开发者问题收集

未捕获的类型错误:无法读取未定义 Javascript 的属性“长度”

2019-12-31
374

我遇到一个问题,我无法在 javascript 中对数据数组调用 .length() 方法。目的是能够遍历日期时间字符串数组,以便将它们转换为 javascript 中的日期对象。这是我的代码。

我的数据:

HTTP 200 OK
Allow: GET, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
  "sales_time_axis": [
    [
      "2019-12-29T10:42:25Z"
    ],
    [
      "2019-12-23T03:13:03Z"
    ],
    [
      "2019-12-23T02:50:51Z"
    ]
  ],

ajax 调用:

$.ajax({
  type: "GET",
  url: endpoint,    
  success: function(data) {
    window.sales_time = data.sales_time_axis
  },
  error: function(error_data) {
    console.log('error')
    console.log(error_data)
  }
})

for 循环:

var sales_time;
var date_array = []

for(i = 0 ; i < sales_time.length ; i++){
  date_array.push(new Date(sales_time[i]))
}

console.log(data_array)

我已将 sales_time 声明为全局变量,但出现此错误:

(index):179 Uncaught TypeError: Cannot read property 'length' of undefined
at (index):179

非常感谢您的帮助!

3个回答

您可能正面临异步变量赋值问题。尝试将 for 循环与成功回调放在一起,并对回调参数上接收的相同 sales_time 变量进行迭代。

$.ajax({
  type: "GET",
  url: endpoint,    
  success: function(data){
    var sales_time = data.sales_time_axis;
    var date_array = []
    for(i = 0 ; i < sales_time.length ; i++){
      date_array.push(new Date(sales_time[i]))
    }
    console.log(data_array)
  },
  error: function(error_data){
    console.log('error')
    console.log(error_data)
  }
})
Pedro Mutter
2019-12-31

您需要先等待 ajax 调用,因为它是异步的

查看以下链接: 如何等待 ajax 请求?

rizesky
2019-12-31

正如其他人指出的那样,ajax 是一个异步过程。ajax 之外的任何内容都同步运行,这意味着它不会等待您的数据到来。您可以这样做的一种方法是将迭代方法作为回调放在 ajax 成功方法中,并将数据作为其参数。

$.ajax({
    // SOME CONFIGS HERE
    success: function(result){
        iterate(result);
    }
});

function iterate(data){
    // Do your iteration here
}

或者,如果您坚持使用全局变量,那么您可以这样做

// Assuming all these are inside the same javascript file

var data = []; // Make this a global value inside your file 

$.ajax({
    // SOME CONFIGS HERE
    success: function(result){
        data = result.data;
        iterate(); // Get data, then hit the iterate process
    }
});

function iterate(){
    // Do your iteration here
    data.forEach(() => { // Some process in here });
}

此方法仅在调用成功完成后才会调用迭代。不要尝试在成功方法之外调用迭代,否则您肯定会得到一个空数组。

如果您的流程依赖于首先完成的承诺,那么您编写代码的思维方式必须改变。您只需要在承诺解决后才执行下一步,而不是在承诺仍未解决时简单地运行它。

Fred A
2019-12-31