我在Formise.then()(这是一个api调用)内部使用了一个包含if语句的for循环。在for循环内可用的for循环之前已初始化的变量,但在after之后没有。
我已经在for循环之前,for循环内部,if语句内部,if语句之后以及for循环之后console.logging了变量。最后一个console.log甚至都没有未定义。它似乎根本没有注册。
我已经在Chrome控制台中尝试了具有相同基本结构的简单版本,并且可以正常工作,但是区别在于,在Chrome控制台中,我不在Promise.then()中。所以我认为有些事情我不了解。
$(document).ready(function() {
const url = 'https://www.ndbc.noaa.gov/data/realtime2/46029.spec';
const newBouyData = new BouyData();
let currentBouyData = newBouyData.getBouyData(url);
currentBouyData.then((text) => {
const today = new Date();
let lineDate;
let line;
let lineArray;
const lines = text.split('\n');
let currentData;
for (let i = 2; i <= lines.length; i++) {
line = lines[i];
lineArray = line.split(' ');
lineDate = new Date(lineArray[0], lineArray[1] - 1, lineArray[2]).toLocaleDateString();
if ( today.toLocaleDateString() === lineDate && today.getHours() === parseInt(lineArray[3]) ) {
currentData = lineArray;
}
}
console.log('currentData after: ', currentData);
. . .
我期望currentData是一个字符串数组。 我什么也没得到。甚至没有console.log。
我想念什么?
感谢您的想法。
答案 0 :(得分:3)
for (let i = 2; i <= lines.length; i++) {
line = lines[i];
lineArray = line.split(' ');
...
}
console.log('currentData after: ', currentData);
数组arr
的有效索引从0
到arr.length - 1
。
您的循环条件为i <= lines.length
,这意味着在上一次迭代中i
的值为lines.length
。 lines[i]
然后访问数组范围之外的元素,得到undefined
。
lineArray = line.split(' ')
然后引发异常,因为undefined
不是对象,而undefined.split
是错误。
这就是循环之后的代码永远不会执行的原因。
尝试i < lines.length
。