达到值后解析递归Promise

时间:2017-10-31 20:16:28

标签: javascript recursion promise bluebird

我有一个递归方法,它基本上会增加一个值,直到达到最大值。

increase(delay) {
    return new Promise((resolve, reject) => {
        if (this.activeLeds < this.MAX_LEDS) {
            this.activeLeds++
            console.log(this.activeLeds)
        }
        return resolve()
    }).delay(delay).then(() => {
        if (this.activeLeds < this.MAX_LEDS) {
            this.increase(delay)
        } else {
            return Promise.resolve()
        }
    })
}

我正在测试一些功能,我想知道increase()方法何时完成(又称已解决)。

bounce(delay) {
    return new Promise((resolve, reject) => {
        this.increase(50).then(console.log('done'))
    })
}

然而,当我在

之后解决承诺时,我认为我做错了什么
this.activeLeds < this.MAX_LEDS

不再是真的。我认为这与我没有解决原始承诺的事实有关,但我无法弄清楚如何修复它。

1 个答案:

答案 0 :(得分:3)

您忘记return来自then回调的递归调用的结果,因此无法等待,承诺将立即实现。

使用

increase(delay) {
    if (this.activeLeds < this.MAX_LEDS) {
        this.activeLeds++
        console.log(this.activeLeds)
    }
    return Promise.delay(delay).then(() => {
        if (this.activeLeds < this.MAX_LEDS) {
            return this.increase(delay)
//          ^^^^^^
        }
    })
}

顺便说一句,我建议避免在每次迭代时测试两次条件,并且即使在第一次调用时也立即停止而没有延迟:

increase(delay) {
    if (this.activeLeds < this.MAX_LEDS) {
        this.activeLeds++
        console.log(this.activeLeds)
        return Promise.delay(delay).then(() => // implicit return from concise arrow body
            this.increase(delay)
        )
    } else {
        return Promise.resolve()
    }
}