meteor观察arrays服务器端

我有一个recursion函数,在服务器端asynchronous构build一棵树,我想“观察”它,每次有变化时,都会重新运行Meteor中的调用方法。

我做了一个简单的例子,用一个recursionreaddir调用来构build一棵树(在实际的应用程序中,每个节点可能需要几分钟的计算,其结果取决于已经探索的节点)

在server / methods.js中

var fs = Meteor.npmRequire('fs') var path = Meteor.npmRequire('path') var tree = function (dir, r) { try { fs.readdir (dir, function (error, files) { if (files && files.length) for (var i = 0; i < files.length; i++) { r[i] = { name : files[i], children : [] } tree(path.resolve(dir, files[i]), r[i].children) } }) } catch (e) { console.log("exception", e)} } Meteor.methods({ 'build_tree' : function () { var r = [] tree("/tmp/", r) return r // Wrong ! } }) 

在客户端/ client.js

 Meteor.call('build_tree', function (error, result) { console.log(error, result) } 

我已经在基于https://www.discovermeteor.com/patterns/5828399的代码的其他部分使用了期货。

但在这种情况下,我由于某种原因而输了

  • 服务器端代码的recursion性质
  • 我希望客户端在每次更​​新服务器端数据结构时自动更新这一事实

我想到的唯一解决方法是逐步将asynchronous结果插入到“扁平”Mongo集合中,并在客户端react native地将其重build为树状结构。

那确实很复杂。 首先,当你的树代码运行asynchronous,你需要提供一个成功的callback/解决一个承诺/返回一个未来或别的东西,所以你可以控制何时meteor方法返回。 那么你需要使用期货推迟你的结果util方法的回报。

但即使如此,我也不知道服务器应该如何知道有什么改变。

我想到的唯一解决方法是逐步将asynchronous结果插入到“扁平”Mongo集合中,并在客户端react native地将其重build为树状结构。

这实际上是一个可行的简单解决scheme。

我设法做到这一点

  • 统计asynchronous计算开始或结束的次数
  • 只有这些数字相等才能解决未来
  • 每次asynchronous计算结束时重新启动函数(以防其返回启动更多asynchronous计算或解决未来)

[closures列表标记的行或代码格式不正确]

 Future = Meteor.npmRequire('fibers/future') FS = Meteor.npmRequire('fs') Path = Meteor.npmRequire('path') const all_files = [] const future = new Future() const to_process = [dir] let started = 0 let ended = 0 const tree = function () { while (to_process.length) { let dir = to_process.pop() started++ FS.readdir (dir, function (error, files) { if (error) { if (error.code == 'ENOTDIR') all_files.push(dir) } else if (files && files.length) { for (let i = 0, leni = files.length; i < leni; i++) { let f = Path.resolve(dir, files[i]) to_process.push(f) } } ended++ tree() }) } if (!to_process.length && started == ended) future['return']() } tree() future.wait() 

它没有“逐步更新”的感觉,即通过更新数据库并让react native来pipe理它,因为所有的计算都在等待最后的Future['return']()但是代码更简单且独立。