2015-04-17 100 views
1

我有异步建立在服务器端树递归函数,我想“观察”它,然后重新运行每次有变化时必须调用方法流星。流星观测阵列服务器端

我已经提出,建立一个递归READDIR调用树(在实际应用中存在,可能需要每个节点几分钟的计算,其结果取决于已经探索过的节点上)

在一个简单的例子服务器/ 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

但在这种情况下,我莫名其妙地失去了应有的

  • 服务器端代码
  • 其实我想要的客户端每次都自动更新服务器端数据的递归性质结构已更新

我想到的唯一解决方法是逐步将异步结果插入到'扁平'Mongo集合中并反应性地将其重新构建为客户端上的树。

回答

1

这确实很复杂。首先,当你的树代码运行异步时,你需要提供一个成功的回调/解决一个承诺/返回一个未来或其他东西,这样你就可以控制何时Meteor方法返回。然后你需要使用Futures来推迟你的结果返回的util方法。

但即使如此,我看不到服务器应该如何知道事情有了变化。

我想到的唯一解决方法是逐步将异步结果插入到'扁平'Mongo集合中,并在客户端反应性地重建它作为树。

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

0

我设法

  • 这样做统计的时候异步计算已启动 或成品
  • 解决未来只有当这些数字相等数量
  • 的每一次重新推出的功能异步计算结束 (以防其返回以启动更多异步计算或解决未来)

[线收列表标记或代码不正确地格式化]

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() 

它没有你通过更新数据库,并让反应管理它,因为所有的计算都得到了“渐进更新”的感觉等待最终的Future['return'](),但代码更简单且独立。