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']()
但是代码更简单且独立。