我想知道如何使用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();
    })
}

10-08 04:32