【发布时间】:2017-12-28 17:37:31
【问题描述】:
我是异步/等待的新手。
我正在尝试使用 async 和 await,但查询没有等待,它最后发生并且页面在查询之前呈现,所以我无法在呈现的页面上得到正确的答案。
这是我使用异步等待之前的代码
orderMiddleware.newOrder = function (req, res) {
var total = 0
var curr_total = 0
// get items from cart
c.query('select * from cart where user_id=:userId',
{ userId: req.user.ID }, function (err, cart) {
if (err) {
console.log(err)
} else {
cart.forEach(function (item) {
// Find item from DB and check their price
c.query('select * from products where id=:id',
{ id: item.item_id },
function (err, foundItem) {
if (err) {
console.log(err)
} else {
curr_total = foundItem[0].price * item.quantity
console.log("currenttotal" + curr_total)
total += curr_total
console.log(total)
}
})
})
console.log(total)
console.log(curr_total)
// Calculate total price
// Multiply all items with their quantity
res.render('orders/new', { cart: cart, total: total })
}
})
}
但是这不能正常工作。 console.log(total) 发生在查询之前,因此结果为零,并且在呈现的页面中呈现为零。 如果我使用异步,也会发生同样的事情。是不是我用错了?
使用异步等待后-
orderMiddleware.newOrder = async (req, res) => {
var total = 0
var curr_total = 0
// get items from cart
var A= c.query('select * from cart where user_id=:userId',
{ userId: req.user.ID }, async (err, cart) => {
if (err) {
console.log(err)
} else {
cart.forEach(async (item) => {
// Find item from DB and check their price
await c.query('select * from products where id=:id',
{ id: item.item_id },
async (err, foundItem) =>{
if (err) {
console.log(err)
} else {
curr_total = foundItem[0].price * item.quantity
console.log("currenttotal" + curr_total)
total += curr_total
console.log(total)
}
})
})
await console.log(total)
// await console.log(curr_total)
// Calculate total price
// Multiply all items with their quantity
await res.render('orders/new', { cart: cart, total: total })
}
})
}
我尝试不使用如下回调:
var A= c.query('select * from cart where user_id=:userId',
{ userId: req.user.ID })
但是我怎样才能得到查询的输出呢? console.log(A) 显示不同的结果。
【问题讨论】:
标签: node.js express asynchronous mariadb mariasql