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>}
它向您显示了调用catch此处的结果:
Run Code Online (Sandbox Code Playgroud)testFunc().then(token => {}).catch(x => {});
您不在乎那个承诺,只是那个环境向您展示了它。从catch回报之日起,这确实是一个未完成的承诺,但稍后会解决。
那只是您在其中运行环境的一个方面。代码本身很好,除了我在注释中提到的问题(getSomething它不会返回承诺,因此没有必要await)。
在评论中,您询问:
catch在这种情况下会回来吗?既然没有抛出错误,应该then正确解决吗?
then并catch始终兑现承诺。他们返回的诺言将被解决或拒绝,具体取决于您对then/ 调用的诺言发生了什么catch,如果他们的处理程序运行了,处理程序中会发生什么以及返回什么。
在此示例中,以下是该代码的作用:
testFunc并获取返回的诺言(async函数始终返回诺言)。称之为承诺A。thenPromise A. then返回一个新的Promise(Promise B)。catch承诺B。catch返回新的承诺(承诺C)。repl.it 向您显示Promise C(当时尚未完成)。¹then处理程序。该then处理器(有效)的回报undefined。undefined满足Promise C(无需调用catch处理程序,因为Promise 已实现,而不是被拒绝)。¹ 在此示例中,允许实现在此处显示已实现状态是允许的,但是出于所有意图和目的,最好将承诺视为未决状态。由于代码永远无法直接观察承诺的状态,因此您的代码无法分辨出差异。
²同样,如果在then调用它之前已经实现了它也是可以的,但是类似地,您永远无法在代码中直接看到它,因此...
| 归档时间: |
|
| 查看次数: |
119 次 |
| 最近记录: |