【问题标题】:call recursive function from promise从 promise 调用递归函数
【发布时间】:2017-11-22 00:33:06
【问题描述】:

我不熟悉承诺。我必须遍历从其getNode 函数返回承诺的树。我已经使用prom.then(....) 成功找到了对 root 的第一次调用。

但是,下一步不起作用。具体来说,递归调用返回 undefined 就行了:

 leftTree = inOrderPromise(ptree,leftIndex);

代码再次正确调用该函数,并将正确的节点放入根目录,但我不知道如何组合我的答案。我该怎么做?

TYIA

PromiseTree.prototype.getNode = function (index, callback) {
    return Promise.resolve(this.data[index]);
};

var inOrderPromise = function(ptree, rootIndex){
    var prom = ptree.getNode(rootIndex,function(){});
    prom.then(function(root){

        var leftTree = [];
        if(root.left){//if node has a left, recursively traverse
            var leftIndex = root.left;
            leftTree = inOrderPromise(ptree, leftIndex);
        }

        var rightTree = [];
        if(root.right){//if node has a right, recursively traverse
            var rightIndex = root.right;
            rightTree = inOrderPromise(ptree, rightIndex);
        }


        //results: leftTree, root, rightTree
        console.log(leftTree.concat(root.value).concat(rightTree));
        return leftTree.concat(root.value).concat(rightTree);
        });
}

【问题讨论】:

标签: javascript recursion promise


【解决方案1】:

使用生成器函数,它们基本上可以更轻松地执行异步迭代,它们也可以很好地与 Promise 配合使用。您可能需要稍微调整一下代码,我没有运行它,但它的方向是正确的。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Iterators_and_Generators

PromiseTree.prototype.getNode = function (index, callback) {
    return Promise.resolve(this.data[index]);
};

function *inOrderPromise(ptree, rootIndex){
        var root = yield ptree.getNode(rootIndex);
        var leftTree = [];
        if(root.left){
            leftTree = yield *inOrderPromise(ptree, root.left);
        }
        var rightTree = [];
        if(root.right){
            rightTree = yield *inOrderPromise(ptree, root.right);
        }


        //results: leftTree, root, rightTree
        console.log(leftTree.concat(root.value).concat(rightTree));
        return leftTree.concat(root.value).concat(rightTree);
}

【讨论】:

  • 好的,所以我让它停止给我编译错误(耶!)。现在我运行它我得到: InOrderPromise {[[GeneratorStatus]]: "suspended"} 仍然没有输出。
  • rightTree = *inOrderPromise(ptree, rightIndex); - 真的吗?现在在 javascript 中的语法正确吗?
  • 您将希望使用async/await 来表示承诺,而不是*/yield
  • @Bergi,不,* / yield 也称为生成器函数,非常适合异步迭代。
猜你喜欢
  • 2016-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-10
  • 1970-01-01
  • 2022-11-29
  • 1970-01-01
  • 2017-03-25
相关资源
最近更新 更多