我编写了以下代码,其中我有一个执行 2 个查询和一些其他操作的发布请求:
router.post('/', (req, res) => {
dbController.query(
"SELECT * FROM users WHERE username = 'myUserName'",
(err, result) => {
console.log('<---- 1 ---->')
}
)
// do something
console.log('<---- 2 ---->')
// do something
dbController.query(
"SELECT * FROM users WHERE username = 'myUserName'",
(err, result) => {
console.log('<---- 3 ---->')
})
res.send('ok')
})
我想按顺序执行函数内的所有指令,所以不要得到这个输出(这是我在执行代码后得到的那个):
<---- 2 ---->
<---- 1 ---->
<---- 3 ---->
我想要这个:
<---- 1 ---->
<---- 2 ---->
<---- 3 ---->
请注意,将关键字添加async
到函数和await
查询后,没有任何变化
由于您将dbController.query
回调函数(err, result) => {...}
作为第三个参数提供,因此它不会返回承诺,而是异步调用回调。如果你 wrap dbController.query
in util.promisify
,你会得到一个返回 promise 的函数
result
,你可以await
,err
,你可以catch
。这两种风格在功能上是等效的,但是使用util.promisify
, 您可以使用async
和await
:
router.post('/', async (req, res) => {
var queryPromise = util.promisify(dbController.query.bind(dbController));
try {
var result = await queryPromise("SELECT * FROM users WHERE username = 'myUserName'")
console.log('<---- 1 ---->')
console.log('<---- 2 ---->')
result = await queryPromise("SELECT * FROM users WHERE username = 'myUserName'")
console.log('<---- 3 ---->')
res.send('ok')
} catch(err) {
res.status(400).send(err);
}
})
(许多其他数据库客户端库提供开箱即用的 Promise 风格。)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句