javascript - NodeJS 等待优先级 - 一个等待以错误的顺序在另一个之前运行(Express、SQLite3 db.all 和 db.run)
问题描述
尝试在 .exports 中运行一个异步函数,获得承诺,然后在下一个异步函数中使用结果,但由于某种原因,无论等待如何,第二个函数都在第一个函数之前。
销售.js =
const sqlite3 = require('sqlite3').verbose()
const db = new sqlite3.Database('./database/stock.db', (err) => {
if (err) return console.error(err.message)
//console.log('Connected to the "stock.db" SQlite database.')
})
module.exports = {
total: function(cartlist) {
return new Promise((resolve) => {
var total = 0
for (x in cartlist){
console.log(cartlist[x].price)
total = total + cartlist[x].price
}
//console.log(total)
resolve(total)
})},
stockloss: function(cartlist) {
return new Promise((resolve) => {
var barcodes = []
const len = (cartlist).length
for(x in cartlist){
var inp = JSON.stringify(cartlist[x].name)
const sql = "SELECT barcode_id FROM products WHERE name ="+inp+";"
db.all(sql, (err, data) => {
if (err) console.error(err.message)
barcodes = barcodes.concat(data)
console.log(barcodes)
})}
resolve(barcodes)
})},
update: function(bars) {
return new Promise((resolve) => {
for(x in bars){
var bar = JSON.stringify(bars[x])
console.log(bar)
const sql = "UPDATE levels WHERE product_id ="+bar+" SET stock_level = stock_level - 1;"
db.run(sql, function(err) {
if (err) console.error(err.message)
console.log("Record updated. ")
})}
resolve()
})}
}
}
index.js(部分)=
'use strict'
const express = require('express')
const handlebars = require('express-handlebars').create({defaultLayout: 'main'})
const bodyParser = require('body-parser')
const app = express()
app.use(express.static('public'))
app.use(bodyParser.urlencoded({ extended: true }))
app.engine('handlebars', handlebars.engine)
app.set('view engine', 'handlebars')
const port = 8080
const sqlite3 = require('sqlite3').verbose()
const db = new sqlite3.Database('./database/stock.db', (err) => {
if (err) return console.error(err.message)
console.log('Connected to the "stock.db" SQlite database.')
})
const sales = require('./sale.js')
. . .
app.get('/checkout', async(req, res) => {
total = await sales.total(cartlist)
var bars = await sales.stockloss(cartlist)
var prom = await sales.update(bars)
cartlist = []
res.render('checkout', {total})
total = 0
})
. . .
不确定我是否对承诺做错了,或者我对异步函数的理解不够。db.run 也可能存在问题,因为我不断看到有关如何更新数据的不同来源。
解决方案
这是我将如何做到的:
async function fetchFromDb(sql) {
return new Promise(resolve, reject) {
db.all(sql, (err, data) => {
if (err) {
console.error(err.message)
reject(err)
}
resolve(data)
})}
}
async function updateRecord(sql) {
return new Promise(resolve, reject) {
db.run(sql, function(err) {
if (err) {
console.error(err.message)
reject(err)
}
console.log("Record updated. ")
resolve()
}
}
}
module.exports = {
total: function(cartlist) {
return new Promise((resolve) => {
var total = 0
for (x in cartlist) {
console.log(cartlist[x].price)
total = total + cartlist[x].price
}
//console.log(total)
resolve(total)
})
},
stockloss: async function(cartlist) {
return new Promise((resolve) => {
var barcodes = []
const len = (cartlist).length
for (x in cartlist) {
var inp = JSON.stringify(cartlist[x].name)
const sql = "SELECT barcode_id FROM products WHERE name =" + inp + ";"
barcodes = barcodes.concat(await fetchFromDb(sql))
resolve(barcodes)
}
})
},
update: async function(bars) {
return new Promise((resolve) => {
for (x in bars) {
var bar = JSON.stringify(bars[x])
console.log(bar)
const sql = "UPDATE levels WHERE product_id =" + bar + " SET stock_level = stock_level - 1;"
try {
await updateRecord(sql)
} catch (err) {
reject(err)
}
resolve('successfully updated record')
}
})
}
}
顺便说一句,这是未经测试的,但它应该可以工作,或者至少可以帮助您获得正确的想法。fetchFromDb
存在于您的文件或对象中的某处。主要问题是将回调转换为承诺,以便您可以在解析运行之前等待结果并连接结果......这就是问题所在。回调不会在函数外部同步返回结果。这是您遇到的问题。
推荐阅读
- three.js - A-Frame中相机和物体之间的碰撞
- ios - 从 AppDelegate Swift 4 更新 tableView 行
- python - 重复使用后关闭数据库连接
- java - RxJava:从内部嵌套循环返回结果
- kotlin - 通过 Jackson 对 Either 进行反序列化
- gradle - JHipster - 无法在 gradle build 上使用 liquibase 连接到 dev postgres DB
- python - 基于ELO的团队匹配算法
- javascript - 如何使用 JS 在循环上淡入/淡出 H1 和背景
- javascript - 点击时从“显示:无”到“显示:内联”的转换
- android - JSON Parsing on error body (JSON Exception) org 。json.JSONException:字符 0 处的输入结束