Promise.then()中的for循环后,变量不可用

时间:2019-03-23 04:47:37

标签: javascript for-loop asynchronous scope

我在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。

我想念什么?

感谢您的想法。

1 个答案:

答案 0 :(得分:3)

for (let i = 2; i <= lines.length; i++) {
  line = lines[i];
  lineArray = line.split(' ');
  ...
}
console.log('currentData after: ', currentData);

数组arr的有效索引从0arr.length - 1

您的循环条件为i <= lines.length,这意味着在上一次迭代中i的值为lines.lengthlines[i]然后访问数组范围之外的元素,得到undefined

lineArray = line.split(' ')然后引发异常,因为undefined不是对象,而undefined.split是错误。

这就是循环之后的代码永远不会执行的原因。

尝试i < lines.length