我有一个递归函数,在服务器端异步构建一棵树,我希望可以“观察”它,并且每当有变化时都能让Meteor中的调用方法重新运行。
我已经制作了一个简化示例,使用递归的readdir调用来构建树(在真实应用程序中,可能需要几分钟进行一次计算,并且其结果取决于已经探索的节点)。
在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/client.js文件中
Meteor.call('build_tree', function (error, result) {
console.log(error, result)
}
在代码的其他部分中,我已经使用了基于 https://www.discovermeteor.com/patterns/5828399 的期货。但在这种情况下,由于以下原因,我有些困惑:
- 服务器端代码的递归性质
- 希望每次更新服务器端数据结构时,客户端自动更新
我能想到的唯一解决方法是将异步结果逐步插入“平坦”的Mongo集合,并在客户端重新构建树形结构以实现反应式重建。