我想知道如何使用promises编写图遍历算法(我使用JavaScript / Bluebird)。每个节点的定义都在数据库中,每个节点都是异步的。
让我们考虑广度优先搜索,我们获得根节点,每个节点都有一个对其子节点的引用。我们需要获取根节点的子节点并将它们排入nodesToVisit
队列,依此类推。
请考虑以下代码:
var Promise = require('bluebird');
var nodesToVisit = [{id:1, children:[2,3]}]; // 1 is the root
Promise.each(nodesToVisit, val => {
console.log(val.id);
if(val.children) {
val.children.forEach(child => {
var getChildFromDatabasePromise = myDatabase.get(child);
nodesToVisit.push(getChildFromDatabasePromise);
});
}
});
这不起作用,因为Promise.each
会在推送getChildFromDatabasePromise
之前完成。
我想问题的核心是如何使用promises创建动态while循环?
答案 0 :(得分:1)
如何将代码包装在函数中并递归调用它?
{'modID1': OrderedDict([('sequences2', {'header2': 5}), ('sequences1', {'header1': 3}), ('sequences3', {'header3': 1})]), 'modID2': OrderedDict([('sequences2', {'header2': 8}), ('sequences1', {'header1': 1})])}