当前位置: 首页 > 知识库问答 >
问题:

node.js如何通过for循环中的局部变量实现promise感知?[副本]

潘翰藻
2023-03-14

我有一个for-loop,它包含一些在循环中声明的局部变量n。因此,我希望n的值一旦程序退出循环就会被销毁。

但是,n的值似乎在for循环之外仍然可用。为什么会这样?另外,我应该在什么时候希望n的值(如果未注释,也是值k)被销毁?

const delayHelper = require('./delayExecutor')

async function main() {
  let promises = [];
  let records = [1, 2, 3, 4];

  for(let i = 0; i < records.length; i++) {
    let n = 1000 + records[i];
    // let k = 123;
    promises.push(delayHelper.delayResolve(() => records[i], 1000).then(data => data + n))
  }

  console.log(await Promise.all(promises));   //print: [ 1002, 1004, 1006, 1008 ]
}

main()
//delayExecutor.js

let delayedResolve = (fun, ms) => {
  return new Promise((y, n) => {
    setTimeout(() => {
      y(fun());
    }, ms);
  });
};

exports.delayResolve = delayedResolve;

共有1个答案

华欣怡
2023-03-14

这里有几个概念需要注意。1.关闭范围。块范围

当您访问内部函数定义中的n时,该变量在该内部函数的闭包范围内保持活动,直到不再需要它为止,

使用let声明n将在块作用域中创建一个新变量(此处为for循环),该变量将在相应的迭代中被锁定到内部函数。

您还可以尝试使用var声明n,这将产生不同的结果-[1005,1006,1007,1008]。这是因为var不是块作用域声明,因此它不会为循环的每次迭代创建新变量。循环结束时n的最终值为1004,该值将用于逻辑data=>data+n

对于你问题的第二部分--据我所知,所有的变量引用都将在函数的末尾被清除。由于n被锁定在内部函数data=>data=n的闭包范围内,n值一旦执行就会被清除。

 类似资料:
  • 问题内容: 我有一个关于变量范围的相当简单的问题。 我对增强型循环很熟悉,但是我不明白为什么我应该声明一个新变量来保留每个元素。一个例子可以澄清我的问题: 那为什么要声明这个新变量呢?毕竟在for循环内是可访问的。我不想使用任何先前的值,只是不想声明一个新变量。(我猜想对于其他可迭代项,使用相同变量可能会更快)。 我想这就是增强型循环的构建方式,但这不会破坏整个范围的想法吗? 上述行为引起了一个问

  • 问题内容: 根据Java语言规范§14.14.2,增强循环的变量必须在循环本地。换句话说,它将编译为: 但这不是: JLS没有为这种语言设计选择提供任何依据。我可以看到如果通过或通过注释修改了局部变量的原因,为什么必须出现类型名称,但是我不明白为什么不允许在其他地方声明的变量的裸名。是否有人对为什么施加此限制有任何见解? 编辑 到目前为止,有几个答案似乎表明,循环之外发生的事情是按这种方式设计语言

  • 问题内容: 我有以下代码可以SSH到节点并从其他设备中找到RSSI。 bot_ipv6是ssh到的ipv6地址的列表,脚本使用pexpect来ssh。 数据现在包含该设备的输出。 我想浏览数据并仅获取地址及其对应的RSSI。当命令可以在本地运行并输出到文件时,此代码有效: 匹配和匹配行是在其中定义的函数,在其他地方则在文件中查找以将字符与所要查找的字符进行匹配。 我的问题是我不知道如何将数据输出到

  • 问题内容: 我有用nodejs编写的代码让我感到困惑 我希望循环内第二个函数中的数据可以推入结果 所以我以前的数据是这样的 像这样 我尝试了几种方法,首先输入命令deferred.resolve();。循环中仅显示1个数据的语句有什么解决方案? 问题答案: 而不是在将立即解决的数组上使用,而是使用它等待一个promise数组: 甚至更好:

  • 问题内容: 我正在尝试解决一个任务(我对Java还是很陌生),并且已经花了很多资源来解决此冲突,但是仍然无法解决(注意:Tuna是我的Scanner变量) } 结果是:线程“ main” java.lang.Error中的异常:未解决的编译问题:重复的局部变量计数 我应该解决的问题是: 编写程序以读取一个数字并将所有数字从1汇总到该数字。例如,如果用户键入6,则输出为21(1 + 2 + 3 +

  • 下面是我的代码 错误:我在封闭范围中定义的局部变量必须是最终的或实际上是最终的