节点 js 闭包需要推送到数组

Posted

技术标签:

【中文标题】节点 js 闭包需要推送到数组【英文标题】:Node js closures need pushing to array 【发布时间】: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 函数,但除此之外我不知道 【参考方案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 工作。 :)

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

【讨论】:

以上是关于节点 js 闭包需要推送到数组的主要内容,如果未能解决你的问题,请参考以下文章

列出git中master分支和当前分支之间的所有文件?如果有任何节点包将结果推送到数组中,那就太好了:)

循环遍历两个对象数组以将匹配值推送到新数组在 React 中不起作用,但在 JS Fiddle 中起作用

我需要使用 graphql 将数组数据推送到 mongodb

将json数据推送到angular js中的现有数组

需要在 jQuery 中从 AJAX 将所有 JSON 推送到一个数组中

从 Vue.js 2 中的计算属性中推送到数组