【问题标题】:Variable becoming undefined in Promise functionPromise 函数中的变量未定义
【发布时间】:2018-07-19 14:32:49
【问题描述】:

我在全局范围内有一个数组 (targets),我将其值传递给一个外部函数 [第三方库,externalConverter],它会进行一些文本转换。该数组的值正在传递给convert 函数,并且转换进行得很好。

const targets = [‘box’, ’box1’, ’box2’, ’box3’]

for (var i = 0; i < targets.length; ++i) {
    console.log(targets[i]); // this is coming out fine
    externalConverter
        .convert(data.text, targets[I])
        .then(results => {
            data.convertedText.push({
                [targets[i]]: results[0]
            });

            //above convertedText array comes out as
            //{“undefined: ”, “nice converted text”}, ...
        })
}

在 Promise 的结果中,我试图访问 targets 值,但在上面的函数中获取 undefined 值。我不确定为什么目标突然变成undefined

有什么想法吗?

【问题讨论】:

标签: arrays node.js promise


【解决方案1】:

i 的值将在任何then 回调执行之前达到其最终值(即targets.length),因此将i 用作索引将超出范围。

使用let i 而不是var i 来创建不会出现此问题的i 的单独实例。

【讨论】:

  • 完美。不是超级熟悉 Nodejs 语法,但这很有效。一个可能的链接来帮助深入研究这一点将不胜感激。
  • to make separate instances -- 虽然如果您深入研究规范,这在技术上是正确的,但对于更多的受众来说,将此行为称为“词法作用域”会更清楚。
  • @PatrickRoberts,虽然let 确实具有词法(因此是块)范围,但该方面并未传达循环将使用单个版本的概念正在递增的变量(具有块范围)。
  • @Cipher,有很多文章讨论这个。例如this
  • @trincot I'm aware of how let works in a for loop。是的,“词法作用域”确实包括这种行为。
猜你喜欢
  • 1970-01-01
  • 2018-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-03
  • 2021-07-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多