【问题标题】:Async object creation in nodejsnodejs中的异步对象创建
【发布时间】:2020-10-16 10:26:46
【问题描述】:

我有点困惑我将如何解决我的问题以及最佳做法是什么。

在我的节点服务器上,我有这个帖子功能:

router.post('/addUser', (req, res, next) => {
    const newUser = new User({
       userName: req.body.userName
       userPicture: req.body.profilePicture
       personLookALike: -> functionThatReturnsAObjectAsynchronously() <-
       ...
    })
}

问题是,我想保存帖子,所以我通常稍后会在代码中使用:

newUser.save()

但 newUser.save() 在对象完全完成之前首先执行(“personLookAlike”属性丢失)

我知道我可以用一个承诺来包装这一切,然后将保存过程放在 then() 块中,但我在对象创建中有更多这些异步函数。

我的方法的最佳做法是什么? 谢谢!

【问题讨论】:

  • 如果你有多个,请在一个链中使用多个 then 调用 :-) 一旦了解了它们的工作原理,切换到 async/await

标签: javascript node.js object asynchronous promise


【解决方案1】:

这似乎是async/await 的理想用例:

router.post('/addUser', async (req, res, next) => {
    const personLookAlike = await functionThatReturnsAObjectAsynchronously();
    const newUser = new User({
       userName: req.body.userName,
       userPicture: req.body.profilePicture,
       personLookALike,
       ...
    })
    newUser.save();
}

【讨论】:

  • 当然。但是 OP 没有询问错误处理,也没有提供任何关于被调用的异步函数可能引发什么样的错误的见解。我假设这段代码有点“示意图”,需要填写更多细节。
  • 如果 OP 没有考虑错误处理,他也不会填写,所以如果您的答案已经包含在原理图中会更好。使用async 函数作为回调(并且必须调用next 回调)很难做到正确。我什至推荐给let a separate wrapper deal with it
  • 哦,我不知道我必须把“异步”标签放在前面(req,res,next)!我已经用 async 试过了,但我处理错了,谢谢!错误处理将在 promise 函数中,在我的 casefunctionThatReturnsAObjectAsynchronously() 和 catch() 中对吗?
【解决方案2】:

functionThatReturnsAObjectAsynchronously 正在执行异步工作,因此您希望“暂停”您的函数,直到异步函数使用 await 稳定下来,然后继续执行您的函数。

例如:

router.post('/addUser', /* NOTICE: */ async (req, res, next) => {
    const newUser = new User({
       userName: req.body.userName
       userPicture: req.body.profilePicture
       personLookALike: /* NOTICE: */ await functionThatReturnsAObjectAsynchronously()
       ...
    })
}

上面的代码假设functionThatReturnsAObjectAsynchronously返回一个Promise并且应该注意错误处理。

您应该进一步了解Promisesasync functionsawait

【讨论】:

  • 非常感谢!你帮了我很多!这也是正确的答案! :)
猜你喜欢
  • 1970-01-01
  • 2018-03-16
  • 1970-01-01
  • 2020-08-07
  • 1970-01-01
  • 1970-01-01
  • 2019-06-30
  • 1970-01-01
  • 2021-11-27
相关资源
最近更新 更多