我知道这个问题在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> }
答案 0 :(得分:5)
上进行了测试
在此处向您显示调用catch
的结果:
testFunc().then(token => {}).catch(x => {});
您不在乎那个承诺,只是那个环境向您展示了它。从catch
返回之日起,这确实是一个未完成的承诺,但稍后会解决。
那只是您在其中运行环境的一个方面。代码本身很好,除了我在注释中提到的问题(getSomething
不会返回承诺,因此无需{{ 1}})。
在评论中您已经询问:
在这种情况下,
await
是否会返回?由于没有引发错误,因此应该在catch
处解决吗?
then
和then
始终返回承诺。根据您对catch
/ then
进行的承诺发生了什么情况,以及如果他们的处理程序被运行,处理程序中发生的情况以及返回的结果,它们返回的承诺将被解决或拒绝。
在此示例中,该代码的作用如下:
catch
并获取返回的诺言(testFunc
函数始终返回诺言)。叫答应A。async
。then
返回新的承诺(承诺B)。then
。catch
返回新的承诺(承诺C)。catch
向您显示Promise C,该请求在该时间点尚待解决。repl.it
处理程序。 then
处理程序(有效)返回then
。undefined
的Promise B来实现,该值也满足了Promise C的值(无需调用undefined
处理程序,因为诺言已经实现,没有被拒绝)。¹允许实现在该示例中显示一个实现状态,而不是在该示例中显示 ,但是出于所有意图和目的,最好将承诺视为未完成的状态。由于代码永远无法直接观察承诺状态,因此您的代码无法分辨出差异。
²同样,如果在调用catch
之前已经实现了它也是允许的,但是类似地,您永远也不能直接在代码中看到它,所以...