我在重写期间偶然发现了以下ES6方法:
async getUsers(res) {
User.findAll().then(users => res.json(users));
}
这对我来说似乎有些不对劲。我原本期望以下内容:
async getUsers(res) {
return User.findAll().then(users => res.json(users));
}
但是,我知道async有许多技巧,例如自动包装承诺,我的直觉也是正确的吗?
答案 0 :(得分:2)
只要调用者不需要访问异步检索的值,编写的代码(没有return
)就可以了。
首先,如果您打算在函数内部使用async
,则只需要await
作为函数定义的一部分。如果您未在内部使用await
(您的代码未显示),则不需要定义的async
部分。所以,它可能就是这样:
getUsers(res) {
User.findAll().then(users => res.json(users));
}
其次,如果调用者想在await
函数上使用getUsers()
,那么它需要返回一个promise(如你所建议的那样)。如果调用者不使用await
或者需要访问返回值,则不需要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
});
}
所以,原始代码可能就好了,只要调用者永远不会期望来自该函数的异步返回值(这是可能的,因为异步操作的结果是与res.json()
一起发送的,并且可能是唯一需要的结果。就await / async而言,您只需要从计划使用等待的函数返回一个promise。
回顾一下:
async
时才需要await
。您的功能可能根本不需要async
关键字。f().then()
或let x = await f()
访问异步响应时,才需要返回的承诺。await
未标记为async
的功能。 await
将从函数中获取返回值,如果返回值不是promise,则会将其包装在已解析的promise中。如果是承诺,它将等待它解决。仅供参考,这是一个非常好,短而甜蜜的review of async/await以及它们如何与承诺互动。