Javascript 将承诺转换为等待/异步

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) {

这应该是一个相当简单和快速的问题,因为我不熟悉使用承诺和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) {
    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:if
res.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');
      }
    });