【问题标题】:Node lazy and async function in forEachforEach 中的节点惰性和异步函数
【发布时间】:2013-07-09 11:16:09
【问题描述】:

我尝试使用(大约 50 000 行)读取文件并在 mongodb 中解析后保存每一行。 Mongodb保存功能是异步的。为了遍历文件,我使用 node-lazy 模块。

我得到的是只有一部分记录保存在 mongodb 中(不是所有函数都调用保存回调)

var stream = fs.createReadStream(inputFile)

new lazy(stream)
    .lines
    .map(String)
    .forEach(function(line){
        db[collection].save(parseLine(line), function(err){

            if (err){
                console.log(err)
            } else {
                count++;
            }
        })
        }

)

所以没有错误,但是计数

所以我想知道解决问题的最佳方法是什么。

更新:

我通过在 forEach 中使用 syncronios 解析函数解决了这个问题,然后当文件被完全读取时,我使用 async.mapSeries 将数据保存到 mongodb。

但我仍然想知道是否可以使用 node-lazy 处理异步,我在文档中没有找到它,也许它只是不可能。

【问题讨论】:

  • 您如何验证只保存了一半的记录?您是否也可以验证 forEach 是否触发了所需的次数?
  • 我检查了 mongodb 集合(在 db 中)。 forEach 被触发了所需的次数。查看我的 UPD。
  • 也许你写操作太快了。谷歌对此保持沉默。但是有可能您尝试在太短的时间内执行多少次写入(在您的情况下是 50k 次写入)。
  • 是的,我可以猜到问题的可能根源,因此我需要按顺序进行写入以确保正确的行为。我要问的是可以在其中使用惰性 forEach 和 async 函数。
  • 你可以创建类似 Promises 的东西来链接请求,或者至少批量执行它们。

标签: node.js stream lazy-loading


【解决方案1】:

我知道它已经过期了几个月,但仅供参考,有人在这里回答了这个问题:

Node and Lazy: How do I know when it's done?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-04
    • 2013-07-25
    • 1970-01-01
    • 1970-01-01
    • 2016-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多