【问题标题】:console.log() is "Canceled" when looping unattended无人看管循环时,console.log() 被“取消”
【发布时间】:2021-01-27 07:07:13
【问题描述】:

我能够重现我在 VS Code 中的 Node 项目中遇到的问题:

for (let i=0; i<50; i++) {
  let text = [ Math.random()>0.5 ? "abc" : "ABC" ];
  console.log(i);
  console.log(text);
  console.log("*")
}

如果我手动执行,一切正常。

如果我让脚本以随机迭代的方式全速运行,则在第一个 console.log 打印其输出后,将打印红色的“已取消”字样。从那时起,第二个console.log(text) 被跳过或输出一个空白字符串(我不知道是哪个)。

另外两个console.log() 语句继续输出正确的值直到循环结束。

“已取消”的颜色与我的console.error() 的输出颜色相同。

一个示例运行如下所示,其中在第七次迭代后发生异常:

我多次重复该脚本,每次“已取消”输出发生在不同的迭代中。如果脚本中的任何地方都有断点,不一定在循环中,则不会发生“取消”。

尽管输出错误,但所有变量的值似乎都是正确的。在我的真实代码中,我将text 的最终值保存到了一个文件中,并且它们正确检出。

发生了什么,有什么需要担心的吗?

【问题讨论】:

  • VSCode 开发者工具中有什么可疑之处吗?
  • 我无法重现Cancelled 输出,我觉得奇怪的是,在使用调试器单步执行时会显示text,但如果您使用console.log(text[0]);,则在没有断点的情况下运行时不会记录任何内容总有输出
  • @rioV8 是的,如果我将其更改为 text[0] 则没有异常。

标签: node.js visual-studio-code


【解决方案1】:

我也有同样的问题。我认为这是某种 VSCode 错误。
当我在事件回调中打印 data 时,console.log 的行为符合预期。但是过了一会儿,主线程存在,console.log输出Canceled

import some modules...

vtgeojson(tiles, { tilesOnly: true })
  .on('data', function (data) {
    featurecollection.features.push(data);
    console.log(data)
  })
  .on('end', function () {
    console.log(featurecollection);
    console.log(featurecollection.features.length);
  })

当我设置断点并逐行打印data时,问题就消失了。

当我在 powershell 中运行脚本时,问题也消失了。

虽然console.log被取消了,但data已经成功推入feature list。该行为很可能是由 vscode 终端或 vscode 处理console.log 命令的方式引起的。

我的node版本是v12.20.0,VSCode版本是:

Version: 1.51.1 (system setup)
Commit: e5a624b788d92b8d34d1392e4c4d9789406efe8f
Date: 2020-11-10T23:34:32.027Z
Electron: 9.3.3
Chrome: 83.0.4103.122
Node.js: 12.14.1
V8: 8.3.110.13-electron.0
OS: Windows_NT x64 10.0.17763

我发现其他人也有类似的问题。
Weird node.js console.log() output behaviour when printing arrays

【讨论】:

  • 调试控制台可以在记录的数组变量中显示层次结构,PS 获取变量的全文转储,我认为它在调试输出中遵循不同的路径
猜你喜欢
  • 2019-08-23
  • 1970-01-01
  • 2017-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-14
  • 2021-10-02
  • 2018-11-01
相关资源
最近更新 更多