我想知道如何使用Promise(我使用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循环?
最佳答案
将代码包装在函数中并递归调用该怎么办?
var nodesToVisit = [{id:1, children:[2,3]}]; // 1 is the root
visitNextBatch();
function visitNextBatch() {
var copyOfNodes = nodesToVisit;
nodesToVisit = [];
Promise.each(copyOfNodes, val => {
console.log(val.id);
if(val.children) {
val.children.forEach(child => {
var getChildFromDatabasePromise = myDatabase.get(child);
nodesToVisit.push(getChildFromDatabasePromise);
});
}
}).then(function() {
visitNextBatch();
})
}