节点 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/await
和Promise.all()
作为对之前所有 cmets 的补充,您在循环中执行完全相同的 .find()
查询 = 多次,效率不高。
@ibrahimmahrir 我知道我必须等待,我使用 setinterval 发现了这一点,但我将如何等待函数完成?我可以在 foundmovies 和 req.body.movies 之间添加一个长度检查,然后调用 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