带有承诺的图遍历
Graph-traversal with promises
我想知道如何使用 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
推送给它之前完成。
我想问题的核心是如何使用 promise 进行动态 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();
})
}
我想知道如何使用 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
推送给它之前完成。
我想问题的核心是如何使用 promise 进行动态 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();
})
}