2015-04-17 129 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'](),但代碼更簡單且獨立。