2015-04-02 73 views
0

我剛開始使用FRP和培根,所以請原諒我對術語的無知。BaconJS目錄結構遞歸示例

我在一個項目,我試圖在谷歌驅動器中創建一個目錄結構。我需要確保在子目錄之前創建父目錄以創建層次結構。

我寫了下面的代碼。但是,幾分鐘後,我遇到了Google拋出的「超出用戶訪問量限制」的情況,這意味着我打電話過快地請求了太多的請求。

我需要找到一種方法來遞歸地優化創建目錄,然後希望添加一些批處理,以便加快順序調用。

有沒有人有關於如何做到這一點的想法?

var _generateFolder = function(dirArray, gDrive, parentDir) { 
    // chunk array into size of 2 elements 
    var chunked = _.chunk(dirArray, 5) 
    return Bacon 
     .sequentially(1000 * 5, chunked) // Stream with all the chunks 
     .flatMapConcat(function(arrayChunk){ // Stream for all items 
      return Bacon.fromArray(arrayChunk) 
     }) 
     .flatMap(_createOrUpdateGFolder) 
     .filter(function removeAllItemsWithNoChildren(dir) { 
      return dir.children.length > 0; 
     }) 
     .flatMap(function createSubDirectoriesForItem(dir) { 
      console.log("Sync children folders:" + dir.title); 
      return _generateFolder(dir.children, gDrive, dir); 
     }) 
} 

dir = { 
    title:"A", 
    children:[ 
     { 
      title: "AA" 
      children:[ 
       { 
        title:"AAA", 
        children:[] 
       } 
      ] 
     }, 
     { 
      title: "AB" 
      children:[ 
       { 
        title:"ABA", 
        children:[] 
       }, 
       { 
        title:"ABB", 
        children:[] 
       } 
      ] 
     }, 
    ] 
} 
_generateFolder(dir, drive, null) 

有沒有辦法讓一個流,遞增目錄到該流,遞歸?然後在該流上使用chunk + sequential?

回答

0

注意:這不是一個解決方案,而是一個快速和骯髒的方法。

我會遞歸地遍歷提供的JSON目錄。 Baconjs提供了一個API Bacon.fromBinder,它允許您創建自定義流。每次我碰到一個「標題」物業,我都會「發出」一個燻肉事件。這將爲訪問的每個標題生成一系列事件。

var dirs = { 
 
    title: "A", 
 
    children: [{ 
 
    title: "AA", 
 
    children: [{ 
 
     title: "AAA", 
 
     children: [] 
 
    }] 
 
    }, { 
 
    title: "AB", 
 
    children: [{ 
 
     title: "ABA", 
 
     children: [] 
 
    }, { 
 
     title: "ABB", 
 
     children: [] 
 
    }] 
 
    }, ] 
 
}; 
 

 
function walk(sink, r) { 
 
    if (Array.isArray(r)) { 
 
    r.forEach(function(child) { 
 
     return walk(sink, child); 
 
    }) 
 
    } else if (typeof r === 'object') { 
 
    sink(r.title); 
 
    walk(sink, r.children); 
 
    } 
 
} 
 

 

 
Bacon.fromBinder(function(sink) { 
 
    walk(sink, dirs); 
 
    return function() { 
 
    // return a sensible unsubscribe 
 
    }; 
 
}).log(); 
 

 
// To insert into DOM - demo purposes 
 
var stream = Bacon.fromBinder(function(sink) { 
 
    walk(sink, dirs); 
 
    return function() {}; 
 
}); 
 

 
$("#events").append('<ul></ul>'); 
 
var list; 
 

 
stream.onValue(function(val) { 
 
    list = $("#events").find('ul'); 
 
    list.append("<li>" + val + "</li>"); 
 
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/bacon.js/0.7.71/Bacon.min.js"></script> 
 
<div id="events"></div>