BaconJS 目录结构递归示例
BaconJS Directory Structure Recursion Example
我刚开始使用 FRP 和 baconjs,所以请原谅我对术语的无知。
我在一个项目中试图在 google 驱动器中创建一个目录结构。我需要确保先于子目录创建父目录以创建层次结构。
我写了下面的代码。然而,几分钟后,我 运行 进入 Google 抛出的 "User rate limit exceeded",这意味着我调用 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?
注意:这不是解决方案,而是一种快速而肮脏的方法。
我会递归地遍历所提供的 JSON 目录。 Baconjs
提供 API Bacon.fromBinder
允许您创建自定义流。每次我点击 "title" 属性,我都会 "emit" 培根事件。这将为访问的每个标题生成事件流。
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>
我刚开始使用 FRP 和 baconjs,所以请原谅我对术语的无知。
我在一个项目中试图在 google 驱动器中创建一个目录结构。我需要确保先于子目录创建父目录以创建层次结构。
我写了下面的代码。然而,几分钟后,我 运行 进入 Google 抛出的 "User rate limit exceeded",这意味着我调用 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?
注意:这不是解决方案,而是一种快速而肮脏的方法。
我会递归地遍历所提供的 JSON 目录。 Baconjs
提供 API Bacon.fromBinder
允许您创建自定义流。每次我点击 "title" 属性,我都会 "emit" 培根事件。这将为访问的每个标题生成事件流。
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>