Gur*_*pof 5 javascript async-await es6-class
在重写过程中我偶然发现了以下ES6方法:
async getUsers(res) {
User.findAll().then(users => res.json(users));
}
Run Code Online (Sandbox Code Playgroud)
这对我来说似乎有点儿麻烦.我原以为是:
async getUsers(res) {
return User.findAll().then(users => res.json(users));
}
Run Code Online (Sandbox Code Playgroud)
但是,我知道async有许多技巧,比如自动包装承诺,我的直觉也是正确的吗?
return只要调用者不需要访问异步检索的值,编写的代码(不带)就可能没问题。
首先,仅当您计划在函数内部async使用时,才需要将其作为函数定义的一部分。await如果您没有使用awaitinside (您的代码没有显示),则async不需要定义的部分。所以,它可能只是这样:
getUsers(res) {
User.findAll().then(users => res.json(users));
}
Run Code Online (Sandbox Code Playgroud)
其次,如果调用者想要使用await该getUsers()函数,那么它需要返回一个承诺(如您所提议的)。如果调用者不会使用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
});
}
Run Code Online (Sandbox Code Playgroud)
因此,只要调用者从不期望该函数的异步返回值,原始代码就可以了(这在这里是可能的,因为异步操作的结果正在发送,res.json()并且这可能是唯一需要的结果)就等待/异步而言,您只需从计划使用等待的函数返回一个承诺。
回顾一下:
asyncawait仅当您计划在函数内部使用时才需要。您的函数可能根本不需要关键字async。f().then()或 via访问异步响应时,才需要返回的 Promise let x = await f()。await未标记为 的函数async。将从await函数中获取返回值,如果返回值不是一个 Promise,它将把它包装在一个已解析的 Promise 中。如果它是一个承诺,它将等待它解决。仅供参考,这是对 async/await以及它们如何与 Promise 交互的非常好的、简短而精彩的回顾。