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
谢谢!
答案 0 :(得分:0)
您声明的第一个订单绝对是唯一正确的订单。如果某件事给您不同的顺序,那么那件事就坏了。
因此,“在线编译器”可能确实存在问题。
**后续解答**
then()
时,它实际上都发生在主循环之外。因此,您对以下陈述是正确的:“我不得不猜测执行的顺序,我首先要说的是它解析22,然后转到程序末尾,然后依次执行.then,然后对吗?我正确吗?” / li>
then()
或catch()
时,都会维持正确的顺序。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' );
})();
代表await
和then
的 catch
语句被注释,因为它们不影响此处的控制流。
This online service等待脚本完成(注意执行需要5秒钟),然后分别输出 stderr 和 stdout 输出(console.warn
和console.error
生成 stderr 输出)。 stderr 和 stdout 分别记录。首先是 stderr 输出,其标题为Error(s), warning(s)
。