Javascript 将承诺转换为等待/异步
这应该是一个相当简单和快速的问题,因为我不熟悉使用承诺和wait/async 这是我最初承诺的功能。(我希望res.send和res.redirect在创建用户后发生) 这是我使用wait/async的新函数Javascript 将承诺转换为等待/异步,javascript,node.js,Javascript,Node.js,这应该是一个相当简单和快速的问题,因为我不熟悉使用承诺和wait/async 这是我最初承诺的功能。(我希望res.send和res.redirect在创建用户后发生) 这是我使用wait/async的新函数 router.post('/add', async (req, res) => { const user = req.body.user; if (user.email && user.username && user.password) {
router.post('/add', async (req, res) => {
const user = req.body.user;
if (user.email && user.username && user.password) {
await User.create(createUserObject(user));
await res.send(user);
await res.redirect('/login');
}
});
我需要在每一行上等待以使代码功能相同,这对吗?我担心我在不需要的地方使用wait。我认为这应该有效
router.post('/add', async (req, res) => {
const user = req.body.user;
if (user.email && user.username && user.password) {
await User.create(createUserObject(user));
res.send(user);
res.redirect('/login');
}
});
您等待的唯一时间是等待将用户添加到数据库中。所以,无论你在哪里等待,你通常都会得到一个回报。那是你可以使用wait的地方
我需要在每一行上等待以使代码功能相同,这对吗
不,你可以,但你不需要
当函数返回承诺时,只需使用
wait
。如果一个函数返回一个“正常”值(一个字符串,数字,对象,等等),那么额外的等待仍然有效,但不是必需的。您不需要将等待放在每个函数调用之前,只需要在异步并返回承诺的函数调用之前
假设行User.create(createUserObject(User))
是唯一的异步调用,那么这应该是唯一需要wait
的行
另一方面,将wait放在每个函数调用之前可能不会损害代码,只会使代码看起来更混乱 无论在哪里等待数据,都需要使用wait。像api调用等。所以不,不是所有地方我都建议切换到TypeScript,这样您就可以确定方法何时返回承诺,何时不返回承诺。这就是说,在没有承诺的情况下使用await
“我担心我在不需要的地方使用await。”然后阅读await
的功能:async/await
是处理承诺的语法糖Wait
仅当您尝试使用的值Wait
是一个承诺时使用才有意义。我考虑过这一点,但这是否确保仅在创建用户后才调用res.send和res.redirect?@AndrewZaw:ifres.send(User)代码>和res.redirect('/login')
当前在中。然后
回调(您的第一个示例无效,因此我们不知道)并且它工作正常,然后是的,此等待
版本将是等效的。是的,因为它们是synchronus函数。这意味着它们从上到下运行。只要得到参数,它们就可以运行。如果参数是异步的,你就必须把wait放在参数前面。@Kevin.a:Nitpick:没有“异步参数”这样的东西。我想你的意思是,如果一个参数是promise,那么它可以/必须是wait
ed.@Kevin.a:我明白了,但我想避免让刚刚开始使用JavaScript中的异步内容的人感到困惑。通过介绍自己的术语,很容易让事情看起来比实际情况更复杂。
router.post('/add', async (req, res) => {
const user = req.body.user;
if (user.email && user.username && user.password) {
await User.create(createUserObject(user));
res.send(user);
res.redirect('/login');
}
});