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

use*_*342 3 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";
}
Run Code Online (Sandbox Code Playgroud)

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

https://repl.it/repls/UntrueLankySorting上进行了测试

它向我展示了这一点:

你好
=>承诺{<pending>}

T.J*_*der 5

https://repl.it/repls/UntrueLankySorting上进行了测试

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

testFunc().then(token => {}).catch(x => {});
Run Code Online (Sandbox Code Playgroud)

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

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

在评论中,您询问:

catch在这种情况下会回来吗?既然没有抛出错误,应该then正确解决吗?

thencatch始终兑现承诺。他们返回的诺言将被解决或拒绝,具体取决于您对then/ 调用的诺言发生了什么catch,如果他们的处理程序运行了,处理程序中会发生什么以及返回什么。

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

  1. 调用testFunc并获取返回的诺言(async函数始终返回诺言)。称之为承诺A。
  2. 调用thenPromise A. then返回一个新的Promise(Promise B)。
  3. 调用catch承诺B。catch返回新的承诺(承诺C)。
  4. repl.it 向您显示Promise C(当时尚未完成)。¹
  5. 承诺A实现了²,它调用了then处理程序。该then处理器(有效)的回报undefined
  6. 这将用值满足Promise B,该值undefined满足Promise C(无需调用catch处理程序,因为Promise 已实现,而不是被拒绝)。

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

²同样,如果在then调用它之前已经实现了它也是可以的,但是类似地,您永远无法在代码中直接看到它,因此...