node.js - nodejs : save function in for loop, 异步问题

标签 node.js asynchronous

NodeJS + Express、MongoDB + Mongoose

我有一个 JSON 提要,其中每条记录都有一组“ field ”属性(例如“ field 名称”“ field 位置”“ field 电话”等)。我想创建提要中所有场所的集合 - 每个场所都有一个实例,没有重复。

我循环遍历 JSON 并测试该 field 是否存在于我的 field 集合中。如果没有,请保存。

jsonObj.events.forEach(function(element, index, array){
    Venue.findOne({'name': element.vname}, function(err,doc){
        if(doc == null){
            var instance = new Venue();
            instance.name = element.vname;
            instance.location = element.location;
            instance.phone = element.vphone;
            instance.save();
        }
    }
}

所需:所有 field 的列表(无重复)。

结果: field 收藏中有大量受骗者。

基本上,循环为 JSON feed 中的每条记录创建了一个新的 Venue 记录。

我正在学习 Node 及其异步特性,因此我相信 for 循环甚至在第一个 save() 函数完成之前就完成了 - 因此 if 语句始终检查空集合。 Console.logging 支持这一说法。

我不知道如何修改它以使其执行所需的任务。我已经尝试了 caolan 的异步模块,但我无法得到它的帮助。我很有可能使用不正确。

非常感谢您为我指明了正确的方向——我已经搜索无果。如果异步模块是正确的答案,我希望您能帮助我了解如何在这种特定情况下实现它。

再次感谢!

最佳答案

为什么不走另一条路呢?你没有说你的持久层是什么,但它看起来像 Mongoose 或可能是FastLegS。无论哪种情况,您都可以在名称字段上创建唯一索引。然后,您可以尝试保存任何内容,并在唯一索引违规时处理错误。

关于node.js - nodejs : save function in for loop, 异步问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9731139/

相关文章:

php - Socket.io + Nodejs 聊天系统以及 PHP : validating data before emitting through node

javascript - 使用 Sinon 在 Promise 中 stub 代码并返回 Resolve()

javascript - while循环javascript的回调方法

ios - 我正在尝试循环遍历字符串数组并触发 api 调用以重新加载 Collection View

java - 使用Spring AsyncTaskExecutor更新DB好不好?

javascript - 从异步或同步 JavaScript 请求返回值

javascript - onChange 触发时如何发出新的 axios 请求?

javascript - Nodejs Promise 无法解析/没有返回数据

javascript - 如何将对象插入 meteor 集合

javascript - body += chunk 会在每次 block 到达时重新分配整个响应字符串吗?