【问题标题】:variable not available after for-loop inside Promise.then()在 Promise.then() 中的 for 循环后变量不可用
【发布时间】:2019-03-23 04:47:36
【问题描述】:

我在 Promise.then() 中使用了一个包含 if 语句的 for 循环(这是一个 api 调用)。在 for 循环之前初始化的变量在 for 循环中可用,但在之后不可用。

我已经在 for 循环之前、for 循环内部、if 语句内部、if 语句之后和 for 循环之后对变量进行了 console.logged。最后一个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。

我错过了什么?

感谢您的意见。

【问题讨论】:

  • 尝试将 let 更改为 var。可能是因为currentData等变量不在for循环的范围内。让我知道这是否有效。
  • 在for循环中添加console.log并调试
  • 检查您的浏览器控制台。如果console.log 没有运行,那么promise 的then 回调没有触发。控制台可能有错误。还可以考虑添加一个catch 回调。
  • 你不在乎为什么控制台没有错误?
  • @skillitzimberg - 您可能在未显示的代码中有 .catch 块

标签: javascript for-loop asynchronous scope


【解决方案1】:
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 &lt;= lines.length,这意味着在最后一次迭代中i 的值是lines.length。 lines[i] 然后访问数组边界之外的元素,产生undefined。

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

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

试试i &lt; lines.length。

【讨论】:

  • 就是这样。循环 101。我知道我错过了一些简单的东西。或者至少希望如此。谢谢。
  • @JaromandaX 是的,因为它没有被执行,因为之前抛出了异常。
  • @JaromandaX 是的,但是 OP 没有提及或询问有关异常的任何内容。只是console.log 输出。你从哪里得到 OP 没有看到错误?
  • 我不会再打扰了
猜你喜欢
  • 1970-01-01
  • 2019-02-02
  • 1970-01-01
  • 2015-07-18
  • 2020-01-21
  • 1970-01-01
  • 2020-12-31
  • 2013-09-29
  • 2019-12-19
相关资源
最近更新 更多