即使在 knex.destroy() 之后,Promise 仍然悬而未决
Promise still pending even after knex.destroy()
我在学习 Promises 方面取得了一些进展,但我不明白为什么 knex 在节点中表现得像这样。
我成功收到一个查询并console.log出来了,但是当我运行
node filename.js
进程在成功打印后不会退出并停留在那里,就像 Promise 仍在挂起一样。
.finally 语句中的 knex.destroy() 不应该结束 Promise 吗?
async function SELECT_ALL_P() {
const transaction = await knex.transaction()
return knex
.select('*')
.from('p')
.then(items => {
return console.log(items)
})
.catch(error => {
console.log(error)
})
.finally(function() {
knex.destroy()
})
}
SELECT_ALL_P()
我试过
.then(items => {
knex.destroy()
return console.log(items)
})
但它也没有用。我需要在终端中按 Ctrl+C 退出节点执行。
调用 knex.destroy()
时,knex 将不允许启动新的 queries/transactions,然后等待所有这些都完成,然后关闭所有内容并销毁池。
在您的示例中,您从不执行 transaction.commit()
或 transaction.rollback(err)
,因此连接永远不会返回到池中并且调用 knex.destroy()
永远不会完成(也许它会在超时后完成) .
实际上,您甚至从未通过该交易进行任何查询。如果您只想创建一个选项以在需要时进行交易,您可以创建 transactionProvider
,然后在第一次请求时懒惰地创建一个单例交易。
我在学习 Promises 方面取得了一些进展,但我不明白为什么 knex 在节点中表现得像这样。
我成功收到一个查询并console.log出来了,但是当我运行
node filename.js
进程在成功打印后不会退出并停留在那里,就像 Promise 仍在挂起一样。 .finally 语句中的 knex.destroy() 不应该结束 Promise 吗?
async function SELECT_ALL_P() {
const transaction = await knex.transaction()
return knex
.select('*')
.from('p')
.then(items => {
return console.log(items)
})
.catch(error => {
console.log(error)
})
.finally(function() {
knex.destroy()
})
}
SELECT_ALL_P()
我试过
.then(items => {
knex.destroy()
return console.log(items)
})
但它也没有用。我需要在终端中按 Ctrl+C 退出节点执行。
调用 knex.destroy()
时,knex 将不允许启动新的 queries/transactions,然后等待所有这些都完成,然后关闭所有内容并销毁池。
在您的示例中,您从不执行 transaction.commit()
或 transaction.rollback(err)
,因此连接永远不会返回到池中并且调用 knex.destroy()
永远不会完成(也许它会在超时后完成) .
实际上,您甚至从未通过该交易进行任何查询。如果您只想创建一个选项以在需要时进行交易,您可以创建 transactionProvider
,然后在第一次请求时懒惰地创建一个单例交易。