为什么在repl.it上的此代码中看到“ Promise {<pending>}”?

时间:2019-03-21 07:14:25

标签: javascript asynchronous promise

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

async function testFunc() {
  var test = await getSomething();
  //test.resolve();
  console.log("hello" + test);
  return "";
}
testFunc().then(token => {}).catch(x => {});

function getSomething() {
    return "ex";
}

在大多数答案中,建议使用.then()来解决诺言,但是我已经做到了,但是我仍然得到诺言。这有什么问题?

https://repl.it/repls/UntrueLankySorting

上进行了测试

它向我展示了这一点:

helloex
=> Promise { <pending> }

1 个答案:

答案 0 :(得分:5)

  

https://repl.it/repls/UntrueLankySorting

上进行了测试

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

testFunc().then(token => {}).catch(x => {});

您不在乎那个承诺,只是那个环境向您展示了它。从catch返回之日起,这确实是一个未完成的承诺,但稍后会解决。

那只是您在其中运行环境的一个方面。代码本身很好,除了我在注释中提到的问题(getSomething不会返回承诺,因此无需{{ 1}})。

在评论中您已经询问:

  

在这种情况下,await是否会返回?由于没有引发错误,因此应该在catch处解决吗?

thenthen始终返回承诺。根据您对catch / then进行的承诺发生了什么情况,以及如果他们的处理程序被运行,处理程序中发生的情况以及返回的结果,它们返回的承诺将被解决或拒绝。

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

  1. 调用catch并获取返回的诺言(testFunc函数始终返回诺言)。叫答应A。
  2. 在承诺A上呼叫asyncthen返回新的承诺(承诺B)。
  3. 在承诺B上呼叫thencatch返回新的承诺(承诺C)。
  4. catch向您显示Promise C,该请求在该时间点尚待解决。
  5. Promise A满足²,它调用repl.it处理程序。 then处理程序(有效)返回then
  6. 这用值为undefined的Promise B来实现,该值也满足了Promise C的值(无需调用undefined处理程序,因为诺言已经实现,没有被拒绝)。

¹允许实现在该示例中显示一个实现状态,而不是在该示例中显示 ,但是出于所有意图和目的,最好将承诺视为未完成的状态。由于代码永远无法直接观察承诺状态,因此您的代码无法分辨出差异。

²同样,如果在调用catch之前已经实现了它也是允许的,但是类似地,您永远也不能直接在代码中看到它,所以...

相关问题