嗯(琐碎的,我已经移动了实际的负载并将其替换了一段时间)我希望有一些代码可以递归:
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);
功能应该是明确的:它基本上创造了承诺"基于"以前的承诺,直到depth
用完为止。
最终数组(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
),它只是在第二个承诺时完全退出。
哦,我该如何解决这个问题?
答案 0 :(得分:1)
您不是在等待递归调用,因此原始调用在此之前完成。
await createSub(maxNum, depth - 1);
这是一个演示:
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);
}
await createSub(maxNum, depth - 1);
}
};
async function test() {
try {
await createSub(1, 2);
} catch (err) {
console.log(err);
}
}
test();
顺便说一下,使用这种方法,您的调用堆栈会继续增长,因此您将失去异步代码的一些优势。没什么大不了的,但要记住一些事情。