Javascript “我为什么要看?”;承诺{<;待定>;}”;从repl.it上的这个代码?
我知道这个问题在stackoverflow上被问了很多,我已经搜索了很多,但仍然无法理解 异步函数testFunc(){ var test=wait getSomething(); //test.resolve(); log(“hello”+测试); 返回“”; } testFunc().then(token=>{}).catch(x=>{}); 函数getSomething(){ 返回“ex”; } 测试了这个 它在此处显示调用Javascript “我为什么要看?”;承诺{<;待定>;}”;从repl.it上的这个代码?,javascript,asynchronous,promise,Javascript,Asynchronous,Promise,我知道这个问题在stackoverflow上被问了很多,我已经搜索了很多,但仍然无法理解 异步函数testFunc(){ var test=wait getSomething(); //test.resolve(); log(“hello”+测试); 返回“”; } testFunc().then(token=>{}).catch(x=>{}); 函数getSomething(){ 返回“ex”; } 测试了这个 它在此处显示调用catch的结果: 你不在乎这个承诺,只是环境向你展示了它。当c
catch
的结果:
你不在乎这个承诺,只是环境向你展示了它。当catch
返回时,这确实是一个悬而未决的承诺,但它会在以后得到解决
这只是运行它的环境的一个方面。除了我在评论中提到的问题(即getSomething
不返回承诺,因此没有必要等待它),代码本身也很好
在您询问的评论中:
在这种情况下,catch
会返回吗?因为没有抛出错误,所以应该在处解决,然后
对吗
然后
和捕获
始终返回承诺。它们返回的承诺将被解析或拒绝,具体取决于您调用的承诺发生了什么,然后/catch
打开,如果它们的处理程序运行,则处理程序中会发生什么以及它返回什么
在本例中,该代码的作用如下:
testFunc
并获取它返回的承诺(async
函数总是返回承诺)。把这称为承诺然后
。然后
返回新的承诺(承诺B)catch
。catch
返回新的承诺(承诺C)repl.it
向您展示了承诺C,该承诺在当时处于挂起状态。ª然后
处理程序。然后
处理程序(有效地)返回未定义的
undefined
实现承诺B,该值实现承诺C(不调用catch
处理程序,因为承诺已实现,未被拒绝)在本例中,允许实现在那里显示已实现状态,但出于所有意图和目的,最好将承诺视为在那一点上挂起。由于代码永远无法直接观察承诺的状态,因此您的代码无法区分它们之间的区别
²类似地,如果在调用
之前就已经实现了,那么它是允许的,但是类似地,您永远无法在代码中直接看到这一点,因此…旁注:“…建议使用.then()来解决承诺…”则不会解决承诺。它观察承诺的解决。旁注2:没有理由等待getSomething()
,因为getSomething
不会返回承诺。@t.J.Crowder没错,在本例中不需要等待。我在(在线NodeJS)上试用了它,得到了输出,因为在这种情况下Promise pending会得到回报吗?因为没有抛出错误,所以应该在右侧解决?@user1692342-然后
和捕获
始终返回一个承诺。我在答案中添加了一些细节以帮助澄清。
testFunc().then(token => {}).catch(x => {});