【发布时间】:2020-05-04 17:45:23
【问题描述】:
我有一个猫鼬连接功能,如果第一次尝试失败,我会尝试等待重新连接:
async connect() {
const options = {...}
try {
console.log("starting")
await this._connectWithRetry(options)
console.log("finished")
} catch (err) {
winston.error(`Could not connect to Mongo with error: ${err}`)
}
}
private async _connectWithRetry(options) {
return new Promise( async (resolve, reject) => {
try {
winston.info("Connecting to mongo...")
await mongoose.connect(this.dbURI, options)
winston.info("Connection successful.")
resolve()
} catch (err) {
winston.info("Failed to connect to mongo. Retrying in 5 seconds...")
setTimeout( async () => {
await this._connectWithRetry(options)
}, 5000)
}
})
}
它成功地等待我连接。但是一旦我连接,第二条控制台线就不会被击中(“完成”)。所以我认为我的承诺解决方案是错误的。我做错了什么?
【问题讨论】:
-
提示:
Promise.resolve()与resolve()不同。此外,如果连接失败,递归调用将创建一个新的 Promise,而原来的 Promise 也会消失而没有解决,所以这不好。 -
Promise.resolve()返回一个新的已解决承诺。但是,如果您调用resolve()参数,您将解决它所属的承诺。 -
如果您进入
catch,那么您将永远不会解决也不会拒绝您创建的第一个承诺。如果第二次调用成功,那么您将解决一个不同的承诺,而第一个仍处于未决状态。 -
尝试从 Promise( async (resolve, reject) just Promise( (resolve, reject)) 中移除异步。这是我的猜测 ;)
标签: javascript mongoose promise