【问题标题】:Is a function that returns a promise always an async function?返回承诺的函数总是异步函数吗?
【发布时间】:2020-01-11 12:24:46
【问题描述】:
如果这三个是正确的,我很困惑。
A(){
Return promise
}
Async A(){
Return promise
}
Async A(){
Return await promise //this seems very wrong but still...
}
以下哪些是正确的 JavaScript?如果不止一个是正确的,那么这里的最佳做法是什么?
【问题讨论】:
标签:
javascript
typescript
promise
async-await
angular-promise
【解决方案1】:
Async/await 可以看作是 Promises 的语法糖。任何返回Promise 对象的函数都可以用作async 函数。这两种风格(promise 风格与 async/await 风格)可以毫无问题地混合使用。
function A() {
return Promise.resolve('foo');
}
async function B() {
var aResult = await A();
return aResult;
}
B().then(console.log);
最佳做法是选择一种风格并坚持下去,以提高可读性。 Async/await 是较新的样式,它的优点是它避免了.then pyramid of doom。
请注意,并非所有运行时都支持 async/await 甚至 Promise,并且可能需要转译器(如 babel)。
【解决方案2】:
您可以使用所有这些,因为这三个都是有效的。但鉴于你的例子,只有第一个是有意义的。
您的每个示例都返回一个 Promise。您可以使用a().then(/*...*/) 或await a()(仅在async 函数内)在他们解决时得到他们的响应。阅读有关Promise 或async/await 的更多信息。
function a() {
return Promise.resolve();
}
这就是你应该如何编写一个返回 Promise 的函数。
async function a() {
return Promise.resolve();
}
这同样有效,但只有实际使用await 关键字的函数才需要使用async 进行注释。只返回 Promise 而不在其主体中使用 await 的函数不需要是 async。
Async A(){
Return await promise //this seems very wrong but still...
}
这只是一个不必要的步骤。阅读更多 here 和 here。