【问题标题】:Node js closures need pushing to array节点 js 闭包需要推送到数组
【发布时间】:2018-03-13 15:18:21
【问题描述】:

我有一个问题,我的代码不会返回已推送数据的数组,我昨晚发现这是关于闭包的问题,​​我研究了它们,但我并没有真正理解它们。所有示例都使用 addeventlistener。 我知道我必须以某种方式等到我的推送完成,因为这是异步的。

app.post("/search", function(req, res){
    var test = []
    for (var key in req.body.movie){
        Movie.find({title: "Gotham"}, function(err, foundMovie){
            test.push(foundMovie)
        })
    }
    console.log(test)
    res.render("index")
});

【问题讨论】:

  • 数组test 将在console.log 发生时为空,因为Movie.find 还没有完成他们的工作(并将项目推入数组)。在所有Movie.find 完成工作后,您必须使用该数组。
  • Movie.find() 可能是异步的。因此,您必须在回调 function(err, foundMovie) 中包含返回结果的代码。
  • 查看async/awaitPromise.all()
  • 作为对之前所有 cmets 的补充,您在循环中执行完全相同的 .find() 查询 = 多次,效率不高。
  • @ibrahimmahrir 我知道我必须等待,我使用 setinterval 发现了这一点,但我将如何等待函数完成?我可以在 foundmovies 和 req.body.movi​​es 之间添加一个长度检查,然后调用 log 函数,但除此之外我不知道

标签: javascript node.js closures


【解决方案1】:

MongoDB/Mongoose 操作是异步的。解决您的问题的一个可能方法是像这样使用async/await

app.post("/search", async function(req, res){
    var test = []
    for (var key in req.body.movie){
        let foundMovie = await Movie.find({title: "Gotham"})
        test.push(foundMovie)
    }
    console.log(test)
    res.render("index")
});

您需要使用更新版本的 Node 才能使 async/await 工作。 :)

也永远不要在循环中执行数据库查询。

【讨论】:

    猜你喜欢
    • 2017-08-29
    • 2017-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-19
    • 2021-04-02
    相关资源
    最近更新 更多