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);
}