Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从promise调用递归函数_Javascript_Recursion_Promise - Fatal编程技术网

Javascript 从promise调用递归函数

Javascript 从promise调用递归函数,javascript,recursion,promise,Javascript,Recursion,Promise,我对承诺不熟悉。我必须遍历从其getNode函数返回承诺的树。我已经使用prom成功地找到了对root的第一个调用。然后(..) 然而,下一步不起作用。具体来说,递归调用返回行中未定义的: leftTree = inOrderPromise(ptree,leftIndex); 代码再次正确地调用了该函数,并将正确的节点放入根中,但我不知道如何组合我的答案。我该怎么做 蒂亚 使用生成器函数,它们基本上可以轻松地执行异步迭代,并且可以很好地处理承诺。你可能需要稍微调整一下代码,我没有运行这个,但

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

然而,下一步不起作用。具体来说,递归调用返回行中未定义的:

 leftTree = inOrderPromise(ptree,leftIndex);
代码再次正确地调用了该函数,并将正确的节点放入根中,但我不知道如何组合我的答案。我该怎么做

蒂亚


使用生成器函数,它们基本上可以轻松地执行异步迭代,并且可以很好地处理承诺。你可能需要稍微调整一下代码,我没有运行这个,但它的方向是正确的


使用生成器函数,它们基本上可以轻松地执行异步迭代,并且可以很好地处理承诺。你可能需要稍微调整一下代码,我没有运行这个,但它的方向是正确的


这里有一些类似的东西,好吧,所以我让它停止给我编译错误(耶!)。现在我运行它时得到:InOrderPromise{[[GeneratorStatus]]:“suspended”}仍然没有输出-真的吗?现在在javascript中语法正确了吗?你会想使用
async
/
wait
来获得承诺,而不是
*
/
yield
@Bergi,不,
*/yield
也被称为生成器函数,对于异步迭代非常有用。这里有一些类似的东西,好吧,所以我让它停止给我编译错误(耶!)。现在我运行它时得到:InOrderPromise{[[GeneratorStatus]]:“suspended”}仍然没有输出-真的吗?现在在javascript中语法是正确的?您将希望使用
async
/
wait
来获得承诺,而不是
*
/
yield
@Bergi,不,
*/yield
也称为生成器函数,非常适合异步迭代。为什么您要提出一个同步函数?哦,还有一个提示,如果你想让一个函数返回一些东西,它需要
返回
一些可能重复的东西,为什么你要提出一个同步的函数?哦,还有一个提示,如果你想让一个函数返回一些东西,它需要
返回一些可能重复的东西
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);
        });
}
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);
}