【发布时间】:2020-09-18 07:43:44
【问题描述】:
我正在使用 Nodejs express 构建一个小应用程序,在其中更新/删除一些数据。完成更新/删除后,我想再次从数据库中返回数据。我使用 promise.all() 是因为我想让一切都成功或一起失败。
我的问题是它没有同步运行。我的代码时不时地在更新/删除发生之前返回数据。
这是一个例子:
const save = async (houseId, personIds, pets, petsToDelete) => {
let dbActions = []
personIds.forEach((personId) => {
pets.forEach((pet) => {
pet.ownerId = personId
})
dbActions.push(
PetRepository.deletePets(personId, petsToDelete),
PetRepository.updatePets(personId, pets),
)
})
await Promise.all(dbActions)
let promiseResult = await Promise.all([
PetRepository.findByHouse({ houseId: houseId })
])
return promiseResult
}
问题是 PetRepository.findByHouse 有时会在循环中的所有 dbAction 执行/完成之前返回数据。
我认为将它们添加到数组中并在循环外的 Promise.all 中使用该数组可以解决问题,但事实并非如此。有什么想法吗?
如何调用 save():
const promiseResponseHandler = (req, res, promise) => {
promise.then(successResponse(req, res)).catch(...errorhandling...)
}
App.put('save/:houseId', (req, res) => {
promiseResponseHandler(req, res, PetService.save(req.params.houseId, req.body[0], req.body[1], req.body[2]))
})
更新:存储库函数
const Mongoose = require('mongoose')
Mongoose.Promise = global.Promise
Mongoose.connection.on('open', () => Logger.info('Db connection established'))
let connectionString
connectionString = `mongodb+srv://${Config.MONGO_HOST}?retryWrites=true`
connection = Mongoose.connect(
connectionString,
{
user: Config.MONGO_USER,
pass: Config.MONGO_PW,
dbName: Config.MONGO_DB,
reconnectTries: 3,
useNewUrlParser: true
}
).catch((err) => {
Logger.error(err)
})
const deletePets = async (personId, petsToDelete) => {
if (petsToDelete.length > 0) {
await Pet.bulkWrite(
petsToDelete.map((petId) => {
deleteMany: {
filter: { personId: personId, petId: petId}
}
})
)
}
}
const updatePets = async (personId, pets) => {
if (pets.length > 0) {
await Pet.bulkWrite(
pets.map((pet) => ({
updateOne: {
filter: { personId: pet.personId, petId: petId },
update: {
$set: { name: pet.name },
$setOnInsert: {
petId: pet.petId,
personId: personId,
houseId: pet.houseId
}
}
}
}))
)
}
}
module.exports = { deletePets, updatePets }
【问题讨论】:
-
如果你不使用它,为什么要标记
async/await?
标签: javascript node.js express promise async-await