声明为异步的方法的正确语法是什么?
What is the correct syntax for a method declared as async?
我在回顾时偶然发现了以下 ES6 方法:
async getUsers(res) {
User.findAll().then(users => res.json(users));
}
这对我来说似乎有问题。我会期待以下内容:
async getUsers(res) {
return User.findAll().then(users => res.json(users));
}
但是,我知道 async 有很多技巧,比如自动包装承诺,所以我的直觉是正确的吗?
只要调用方不需要访问异步检索的值,编写的代码(没有 return
)可能没问题。
首先,仅当您计划在函数内部使用 await
时,才需要将 async
作为函数定义的一部分。如果您没有在内部使用 await
(您的代码未显示),则不需要定义的 async
部分。所以,可能就是这样:
getUsers(res) {
User.findAll().then(users => res.json(users));
}
其次,如果调用者想在 getUsers()
函数上使用 await
,那么它需要 return 一个承诺(如您所建议的)。如果调用者不使用 await
或以其他方式需要访问 return 值,则不需要 return
。所以,如果你想在这个函数上使用 await
,那么它应该是这样的:
getUsers(res) {
// return promise so caller can get async value
return User.findAll().then(users => {
res.json(users);
return users; // return value so caller can get access to the value
});
}
因此,只要调用者从不期望来自该函数的异步 return 值(这在这里是可能的,因为异步操作的结果是通过 res.json()
并且这可能是唯一需要的结果。就 await/async 而言,您只需要 return 来自您计划使用 await 的函数的承诺。
回顾一下:
async
仅当您计划在函数内部使用 await
时才需要。您的函数可能根本不需要 async
关键字。
- 只有当调用者希望能够通过传统的
f().then()
或 let x = await f()
.[=49 访问异步响应时,才需要 returned promise =]
- 调用者可以
await
未标记为 async
的函数。 await
将从函数中获取 return 值,如果 return 值不是一个承诺,它将把它包装在一个已解决的承诺中。如果是promise,会等待resolve。
仅供参考,这是一个非常好的、简短而有趣的 review of async/await 以及它们如何与 promise 交互。
我在回顾时偶然发现了以下 ES6 方法:
async getUsers(res) {
User.findAll().then(users => res.json(users));
}
这对我来说似乎有问题。我会期待以下内容:
async getUsers(res) {
return User.findAll().then(users => res.json(users));
}
但是,我知道 async 有很多技巧,比如自动包装承诺,所以我的直觉是正确的吗?
只要调用方不需要访问异步检索的值,编写的代码(没有 return
)可能没问题。
首先,仅当您计划在函数内部使用 await
时,才需要将 async
作为函数定义的一部分。如果您没有在内部使用 await
(您的代码未显示),则不需要定义的 async
部分。所以,可能就是这样:
getUsers(res) {
User.findAll().then(users => res.json(users));
}
其次,如果调用者想在 getUsers()
函数上使用 await
,那么它需要 return 一个承诺(如您所建议的)。如果调用者不使用 await
或以其他方式需要访问 return 值,则不需要 return
。所以,如果你想在这个函数上使用 await
,那么它应该是这样的:
getUsers(res) {
// return promise so caller can get async value
return User.findAll().then(users => {
res.json(users);
return users; // return value so caller can get access to the value
});
}
因此,只要调用者从不期望来自该函数的异步 return 值(这在这里是可能的,因为异步操作的结果是通过 res.json()
并且这可能是唯一需要的结果。就 await/async 而言,您只需要 return 来自您计划使用 await 的函数的承诺。
回顾一下:
async
仅当您计划在函数内部使用await
时才需要。您的函数可能根本不需要async
关键字。- 只有当调用者希望能够通过传统的
f().then()
或let x = await f()
.[=49 访问异步响应时,才需要 returned promise =] - 调用者可以
await
未标记为async
的函数。await
将从函数中获取 return 值,如果 return 值不是一个承诺,它将把它包装在一个已解决的承诺中。如果是promise,会等待resolve。
仅供参考,这是一个非常好的、简短而有趣的 review of async/await 以及它们如何与 promise 交互。