Nodejs表达promise.all()。then()不同步

问题描述 投票:0回答:1

我正在使用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中使用该数组。循环之外的所有方法都可以解决此问题,但事实并非如此。有任何想法吗?

javascript node.js express promise async-await
1个回答
0
投票

您正在使用壁垒(回调)来解决此问题。使用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
}

-1
投票

创建dbAction的数组,然后使用Promise.all()执行它们是一个好方法。使您的保存功能异步,并等待第一个dbActions充满]

© www.soinside.com 2019 - 2024. All rights reserved.