Node.Js相同代码的不同输出异步

时间:2018-07-09 21:00:13

标签: javascript node.js asynchronous

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,我不确定执行的正确顺序。 使用NodeJ在本地运行此命令,我得到以下输出:

a 22
b Oh no!
c

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

a 22
c
b Oh no! 

同时使用其他

Error(s), warning(s):

b Oh no!

a 22
c

谢谢!

2 个答案:

答案 0 :(得分:0)

您声明的第一个订单绝对是唯一正确的订单。如果某件事给您不同的顺序,那么那件事就坏了。

因此,“在线编译器”可能确实存在问题。

**后续解答**

  1. 每次调用then()时,它实际上都发生在主循环之外。因此,您对以下陈述是正确的:“我不得不猜测执行的顺序,我首先要说的是它解析22,然后转到程序末尾,然后依次执行.then,然后对吗?我正确吗?” / li>
  2. 您并没有真正在“嵌套”任何东西,但是您正在链接东西。每次链接then()catch()时,都会维持正确的顺序。
  3. 如果其中一个承诺失败(被拒绝,抛出异常等),它将导致每个then()跳过直到找到catch()。当找到catch()时,下一个诺言便会再次正常解决。

答案 1 :(得分:0)

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

a 22
b Oh no!
c

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

此代码段的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' );
})();
代表awaitthen

catch语句被注释,因为它们不影响此处的控制流。

This online service等待脚本完成(注意执行需要5秒钟),然后分别输出 stderr stdout 输出(console.warnconsole.error生成 stderr 输出)。 stderr stdout 分别记录。首先是 stderr 输出,其标题为Error(s), warning(s)