承诺递归

joe*_*elc 3 javascript recursion promise

我已经看了几个关于promises递归的问题,并对如何正确实现它们感到困惑:

我把一个简单的例子(见下文)放在一起 - 这只是一个例子,所以我可以理解如何使用promises工作进行递归,而不是代表我正在工作的代码.

Net-net,我想要解决的承诺,但根据节点上的输出,它无法解决.有关如何解决问题的任何见解?

var i = 0;

var countToTen = function() { 
    return new Promise(function(resolve, reject) {
        if (i < 10) {
            i++;
            console.log("i is now: " + i);
            return countToTen();
        }
        else {
            resolve(i);
        }
    });
}

countToTen().then(console.log("i ended up at: " + i));
Run Code Online (Sandbox Code Playgroud)

和控制台上的输出:

> countToTen().then(console.log("i ended up at: " + i));
i is now: 1
i is now: 2
i is now: 3
i is now: 4
i is now: 5
i is now: 6
i is now: 7
i is now: 8
i is now: 9
i is now: 10
i ended up at: 10
Promise { <pending> }
Run Code Online (Sandbox Code Playgroud)

承诺永远不会解决.

Syl*_*ter 11

如果您查看代码的时间i长度小于10,则表示您正在递归并且永远不会解析承诺.你最终解决了一个承诺.但这不是初始来电者的承诺.

您需要使用递归返回的promise来解决.如果您使用承诺解决系统的工作原理,它将在解析值之前仍然无法解决:

let i = 0;
const countToTen = () => new Promise((resolve, reject) => {
    if (i < 10) {
      i++;
      console.log("i is now: " + i);
      resolve(countToTen());
    } else {
      resolve(i);
    }
  });

countToTen().then(() => console.log("i ended up at: " + i));
Run Code Online (Sandbox Code Playgroud)

最后一部分也有错误.你没有提供一个函数,then如果你已经做了一些实际上会等待的东西你会得到第"i ended up at: 0"一个.