我正在使用Nodejs express构建一个小应用程序,在此我可以更新/删除一些数据。完成更新/删除后,我想再次从数据库返回数据。我使用的是promise.all(),因为我想让所有事情成功或失败。
我的问题是它没有同步运行。我的代码不时地在更新/删除发生之前返回数据。
这里是一个例子:
const save = (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),
)
})
let promiseResult = null
Promise.all(dbActions).then(
(promiseResult = Promise.all([
PetRepository.findByHouse({ houseId: houseId })
]))
)
return promiseResult
}
问题在于,PetRepository.findByHouse有时会在执行/完成循环中的所有dbAction之前返回数据。
我以为将它们添加到数组中并在Promise中使用该数组。循环之外的所有方法都可以解决此问题,但事实并非如此。有任何想法吗?
您正在使用壁垒(回调)来解决此问题。使用async / await会更容易。为了能够等待Promise.all
,您需要将save
定义为异步函数,如下所示:
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 PetRepository.findByHouse({ houseId: houseId })
return promiseResult
}
创建dbAction的数组,然后使用Promise.all()
执行它们是一个好方法。使您的保存功能异步,并等待第一个dbActions充满]