Javascript 递归承诺赢得';不执行
在一段代码中(很简单,我移动了实际的负载,并用一个时间代替了它),我希望承诺会递归发生:Javascript 递归承诺赢得';不执行,javascript,recursion,promise,Javascript,Recursion,Promise,在一段代码中(很简单,我移动了实际的负载,并用一个时间代替了它),我希望承诺会递归发生: const all_related = []; const createSub = async function(maxNum, depth) { if (depth > 0) { const n = 0; console.log(`depth: ${depth}`); const id = depth*maxNum + n + 1; console.log(`i
const all_related = [];
const createSub = async function(maxNum, depth) {
if (depth > 0) {
const n = 0;
console.log(`depth: ${depth}`);
const id = depth*maxNum + n + 1;
console.log(`id: ${id}`);
try {
const promise = new Promise(resolve => {
setTimeout(resolve, 10, this);
});
await promise;
all_related.push(id);
console.log('after');
} catch (err) {
console.log(err);
}
createSub(maxNum, depth - 1);
}
};
try {
await createSub(1, 2);
} catch(err) {
console.log(err);
}
console.log(all_related);
该函数应该很清楚:它基本上是基于以前的承诺创建承诺,直到它用完深度
最后一个数组(all_related
)我希望是[3,3]
。此外,我希望日志如下所示:
depth: 2
id: 3
after
depth: 1
id: 2
after
[ 3, 2 ]
然而,我看到的日志是:
depth: 2
id: 3
after
depth: 1
id: 2
[ 3 ]
也没有任何错误日志记录,也没有任何报告。-因此,这表明第二个“深度”承诺根本没有执行。-为什么会这样?函数被执行(我看到id:2
),它只是在第二次承诺时完全退出
哦,我该如何解决这个问题呢?您没有在等待递归调用,因此原始调用在该调用之前完成
await createSub(maxNum, depth - 1);
下面是一个演示:
const all_related=[];
const createSub=异步函数(maxNum,depth){
如果(深度>0){
常数n=0;
log(`depth:${depth}`);
const id=深度*maxNum+n+1;
log(`id:${id}`);
试一试{
常量承诺=新承诺(解析=>{
setTimeout(解析,10,此);
});
等待承诺;
所有相关推送(id);
console.log('after');
}捕捉(错误){
控制台日志(err);
}
等待createSub(最大值,深度-1);
}
};
异步函数测试(){
试一试{
等待createSub(1,2);
}捕捉(错误){
控制台日志(err);
}
}
test()代码>你不需要让“递归”调用成为等待createSub(…)
?我会记住这个提示-虽然这段代码基本上是一个集成测试的设置(填充一个db并在它们之间创建链接),所以不是为了优化。