2015-04-02 38 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>