递归 javascript 承诺的正确链接

Correct chaining of a recursive javascript promise

我正在尝试编写一个递归函数,该函数在解析为正确的值之前多次调用自身。

const recursivePromise = (val = 1) => {
  return new Promise((resolve, reject) => {
    if (val > 5) {
      resolve(val)
    } else {
     return recursivePromise(val + 1)
    }
  })
}

const doSomethingWithResult = (val) => {
  return new Promise((resolve, reject) => {
    resolve(val + 2)
  })
}

recursivePromise().then(doSomethingWithResult).then(value => console.log(value))

如果我给出初始值“6”,promise 将正确解析并将值传递给链接到它的第二个 promise。但是,如果 recursivePromise 必须调用自身一次或多次,解析值将永远不会到达承诺链的第二个元素。

谁能指出我在这里遗漏了什么?

当您调用 new Promise(callback) 时,回调的 return 值将被忽略。您必须显式调用 resolve 来实现承诺,即

const recursivePromise = (val = 1) => {
    return new Promise((resolve, reject) => {
        if (val > 5) {
            resolve(val)
        } else {
            recursivePromise(val + 1).then(resolve)
        }
    })
}

更好的是,在没有 new Promise 的情况下重写它:

const recursivePromise = (val = 1) => {
    if (val > 5)
        return Promise.resolve(val)
    return recursivePromise(val + 1)
}

recursivePromise().then(console.log)