递归承诺不会执行

时间:2018-01-27 16:11:17

标签: 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(`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),它只是在第二个承诺时完全退出。

哦,我该如何解决这个问题?

1 个答案:

答案 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();

顺便说一下,使用这种方法,您的调用堆栈会继续增长,因此您将失去异步代码的一些优势。没什么大不了的,但要记住一些事情。