【问题标题】:Promise and Node JS承诺和节点 JS
【发布时间】:2018-09-26 16:55:47
【问题描述】:

我需要你的帮助来解决一个“简单”的问题,但这个承诺对我来说又是一个错误......

这不是我的代码示例。

 // In a middleware, i have a mongoose request

Request
.find({ user: req.user.email })
.then(function (allDatasets) {
    allDatasets.forEach(function (oneDataset) {
        if (oneDataset.use_case == reqParams.use_case) {
            res.status(400).json({
                'msg': 'My response'
            })
        }
    })
})

// And my code continue...

如果条件为真,我希望节点返回此响应并停止代码!但是..节点是异步的,当我的循环运行时,下面的代码会被执行。

我试图把下面的代码放在一个.then()中但是它并没有等待循环结束继续执行代码...

感谢您的帮助

【问题讨论】:

  • 您可能需要澄清您的问题......也许您想将function (oneDataset) 设为async function (oneDataset),然后等待一些代码?
  • @MatthiasHerrmann 你不能通过返回来停止 forEach。 stackoverflow.com/questions/6260756/…
  • 我不完全确定您的问题是什么。如果其中有多个满足响应要求的事物,则 for each 肯定会导致问题。但是因为您提到了承诺,我想知道您的问题是否与您的代码示例中不存在的循环有关......否则,承诺与您的问题无关。
  • 我希望 Node 在继续之前等待 forEach 的全部执行...
  • @Zarathoustra75 为什么?鉴于您问题中的代码,这没有任何意义。 forEach 中没有任何东西值得等待。

标签: javascript node.js mongoose foreach promise


【解决方案1】:

我想你真正想要的是

Request.find({ user: req.user.email })
.then(function (allDatasets) {
    if (allDatasets.some(oneDataset => oneDataset.use_case == reqParams.use_case)) {
        res.status(400).json({
           'msg': 'My response'
        })
    } else {
        // And my code continue...
    }
});

【讨论】:

  • 试过了,但是我下面有很多带有函数的代码,这个方法破坏了所有其余的代码。我想使用 NodeJS 方法来解决我的问题。
  • 好吧,如果您有很多代码需要等待Request.find(),那么您有很多代码需要进入then 处理程序。 (或者在从那里调用的函数中,当然)。没有办法解决这个问题。
  • 也许async/await 语法可以简化您的代码,但在概念上是一样的。
【解决方案2】:

最好的方法,你可以使用异步函数 const allDatasets = await Request.find({ user: req.user.email });

allDatasets.forEach(function (oneDataset) {
    if (oneDataset.use_case == reqParams.use_case) {
        res.status(400).json({
            'msg': 'My response'
        })
    }
})
//you can continue your code here

【讨论】:

    猜你喜欢
    • 2016-09-08
    • 2017-07-23
    • 1970-01-01
    • 1970-01-01
    • 2019-03-07
    • 2018-10-11
    • 1970-01-01
    • 2016-05-17
    • 2021-12-23
    相关资源
    最近更新 更多