Javascript “我为什么要看?”;承诺{<;待定>;}”;从repl.it上的这个代码?

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

我知道这个问题在stackoverflow上被问了很多,我已经搜索了很多,但仍然无法理解

异步函数testFunc(){ var test=wait getSomething(); //test.resolve(); log(“hello”+测试); 返回“”; } testFunc().then(token=>{}).catch(x=>{}); 函数getSomething(){ 返回“ex”; } 测试了这个

它在此处显示调用
catch
的结果:

你不在乎这个承诺,只是环境向你展示了它。当
catch
返回时,这确实是一个悬而未决的承诺,但它会在以后得到解决

这只是运行它的环境的一个方面。除了我在评论中提到的问题(即
getSomething
不返回承诺,因此没有必要等待它),代码本身也很好

在您询问的评论中:

在这种情况下,
catch
会返回吗?因为没有抛出错误,所以应该在
处解决,然后
对吗

然后
捕获
始终返回承诺。它们返回的承诺将被解析或拒绝,具体取决于您调用的承诺发生了什么,然后/
catch
打开,如果它们的处理程序运行,则处理程序中会发生什么以及它返回什么

在本例中,该代码的作用如下:

  • 调用
    testFunc
    并获取它返回的承诺(
    async
    函数总是返回承诺)。把这称为承诺
  • 对承诺A调用
    然后
    然后
    返回新的承诺(承诺B)
  • 对承诺B调用
    catch
    catch
    返回新的承诺(承诺C)
  • repl.it
    向您展示了承诺C,该承诺在当时处于挂起状态。ª
  • Promise A实现了²,它调用
    然后
    处理程序。
    然后
    处理程序(有效地)返回
    未定义的
  • 使用值
    undefined
    实现承诺B,该值实现承诺C(不调用
    catch
    处理程序,因为承诺已实现,未被拒绝)

  • 在本例中,允许实现在那里显示已实现状态,但出于所有意图和目的,最好将承诺视为在那一点上挂起。由于代码永远无法直接观察承诺的状态,因此您的代码无法区分它们之间的区别


    ²类似地,如果在调用
    之前就已经实现了,那么它是允许的,但是类似地,您永远无法在代码中直接看到这一点,因此…

    旁注:“…建议使用.then()来解决承诺…”
    不会解决承诺。它观察承诺的解决。旁注2:没有理由等待getSomething()
    ,因为
    getSomething
    不会返回承诺。@t.J.Crowder没错,在本例中不需要等待。我在(在线NodeJS)上试用了它,得到了输出,因为在这种情况下Promise pending会得到回报吗?因为没有抛出错误,所以应该在右侧解决?@user1692342-
    然后
    捕获
    始终返回一个承诺。我在答案中添加了一些细节以帮助澄清。
    testFunc().then(token => {}).catch(x => {});