未捕获的类型错误:无法读取未定义 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