BaconJS目录结构递归示例

时间:2015-04-02 20:16:39

标签: recursion frp bacon.js

我刚刚开始使用FRP和baconjs,请原谅我对术语的无知。

我正在尝试在google驱动器中创建目录结构的项目。我需要确保在子目录之前创建父目录以创建层次结构。

我已经编写了以下代码。但是,几分钟后,我已经遇到了超过用户限制的问题"谷歌抛出这意味着我过快地给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?

1 个答案:

答案 0 :(得分: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>");
})
&#13;
<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>
&#13;
&#13;
&#13;