本文介绍了使用递归API的承诺的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
请在这里找到code
我试图做递归与使用承诺异步功能。我想连续发生它(所以没有$ q.all),并希望等到所有节点都在然后
主通话被解雇处理。换句话说,正在退出
需要在年底进行打印。我该怎么办呢?
感谢。
程序
VAR asyncPrint =功能(VAL){
变种推迟= $ q.defer(); $超时(函数(){
deferred.resolve(执行console.log(VAL));
//console.log(val);
},1000); 返回deferred.promise;
};
VAR树= {
1:{节点:1,CH:[2,3]},
2:{节点:2,CH:[4]},
3:{节点:3,CH:[]},
4:{节点:4,CH:[5]},
5:{节点:5,CH:[]}
} 功能复发(TRE,节点){
返回Async.asyncPrint(节点)
。然后(函数(){
变种CH =唱到tre [node.node] TRE [node.node]·CH:[];
如果(ch.length大于0){
angular.forEach(CH,功能(D){
返回复发(TRE,TRE [D]。)
})
}
})
} 复发(树,树[1]),然后(函数(){
的console.log('你退出)
})
输出
对象{节点:1,CH:数组[2]}
您正在退出
对象{节点:2,CH:数组[1]}
对象{节点:3,CH:数组[0]}
对象{节点:4,CH:数组[1]}
对象{节点:5,CH:数组[0]}
解决方案
That doesn't work - you don't return a promise here for when you are ready with the recur
calls but just return undefined
. You indeed want to use all
here:
return $q.all(ch.map(function(d) {
return recur(tre, tre[d]);
});
Or, for sequentially processing the ch
array:
function next(i) {
if (i<ch.length)
return recur(tre, tre[ch[i]]).then(next.bind(null, i+1));
else
return i;
}
return next(0);
这篇关于使用递归API的承诺的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!