【问题标题】:Node.Js Different output for the same code AsyncNode.Js 相同代码的不同输出异步
【发布时间】:2018-07-09 21:00:12
【问题描述】:
Promise.resolve(22)
  .then((s)=> console.log('a',s))
  .then( () => {
    throw 'Oh no!';
  }).catch( err => {
    console.error( 'b', err );
  }).then( () => {
    console.log( 'c' );
  });

^ 我正在学习异步编程,我了解到 .then 在 promise 中等待执行结束,然后执行,但是这部分充满了 .then,我不确定正确的执行顺序. 使用 NodeJs 在本地运行它,我得到以下输出:

a 22
b Oh no!
c

但是在在线编译器上运行相同的代码我得到不同的执行顺序。 在一个我得到这个:

a 22
c
b Oh no! 

在其他时候

Error(s), warning(s):

b Oh no!

a 22
c

提前致谢!

【问题讨论】:

  • 什么是 oneother 编译器?如果您有问题,请考虑提供一种方法来复制它。见stackoverflow.com/help/mcve。如果您正确执行此操作,则不太可能按时间顺序获得 While on other 输出,因为这不是 Promise 的工作方式。
  • 这些“其他”似乎将输出分组到错误/日志中
  • 在线编译器是我在 google rextester.com/l/nodejs_online_compilertutorialspoint.com/execute_nodejs_online.php 上找到的。在 jsfiddle 上执行此命令与第一个命令(我在本地得到的那个)输出相同
  • @R1ddler。与其使用这些服务,不如直接在浏览器中启动开发者控制台来查看实际结果。

标签: javascript node.js asynchronous


【解决方案1】:

您陈述的第一个顺序绝对是唯一正确的顺序。如果某样东西给了你一个不同的顺序,那么那个东西就坏了。

所以你的“在线编译器”可能真的有问题。

** 后续回复**

  1. 每次调用then() 时,它实际上都发生在主循环之外。所以你对这个陈述是正确的:“我不得不猜测执行顺序我会说它首先解析 22 然后进入程序的末尾,然后一个接一个地执行 .then ?我正确吗?”。
  2. 您实际上并不是在“嵌套”任何东西,而是在链接东西。每次链接 then()catch() 时,都会保持正确的顺序。
  3. 如果其中一个承诺失败(被拒绝、抛出异常等),它将导致每个then() 跳过,直到找到catch()。当它找到catch() 时,下一个promise 会再次正常解析。

【讨论】:

  • 您能否详细说明为什么第一个订单是唯一正确的?那是嵌套时如何执行 .then 的吗?一个接一个地?如果我不得不猜测执行顺序,我会说首先它解析 22 然后进入程序末尾,然后一个接一个地执行 .then ?我说的对吗?
【解决方案2】:

此代码并非特定于 Node.js,并且将在任何 ES6 环境中以相同的方式运行,例如浏览器控制台,因此将远程运行 Node.js 的在线服务的控制台输出与本地 Node.js 进行比较是没有意义的。

a 22
b Oh no!
c

是执行控制台输出的正确顺序,不能有 差异。

这个 sn-p 的 async..await 对应物可以更好地理解控制流:

(async () => {
  try { 
    let s = /* await */ 22;
    /* await */ console.log('a',s);
    throw 'Oh no!';
  } catch (err) {
    /* await */ console.error( 'b', err );
  }
  /* await */ console.log( 'c' );
})();

await 表示 thencatch 的语句被注释,因为它们不影响这里的控制流。

This online service 等待脚本完成(注意执行需要 5 秒),然后分别打印 stderrstdout 输出(console.warnconsole.error导致 stderr 输出)。 stderrstdout 分别记录。 stderr 输出首先出现,标题为Error(s), warning(s)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-21
    • 2018-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多