redux 将项目数组逐一插入数据库

mbjcgjjk  于 2022-11-12  发布在  其他
关注(0)|答案(1)|浏览(115)

我有一个项目数组,我想一个接一个地插入数据库,如下所示:

[{}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}]

所以基本上,会有一个for..of循环遍历这个数组,并将它们一个接一个地插入。我希望在发生错误时退出循环,例如,错误发生在第8项之后:

[{}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}] 
                                 ^: error here

所以我想在这个阶段停止执行,如何实现呢?我的代码看起来像这样:

const [createOneUser, { isLoading, isError, isSuccess, error }] = useCreateOneUserMutation()
const bulkUsers = [{}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}] 
const handleInsert = async()=>{
 for(const obj of bulkUsers){
    await createOneUser(obj) // <--- here
 }
}
return <button onClick={handleInsert}>start bulk insert</button>

这看起来和我们通常使用useEffect做的事情不同,但这只是一个实现它的计划草案,我不知道如何做。
如何在redux工具包查询中实现类似的逻辑?

q9rjltbz

q9rjltbz1#

我能够通过使用redux的.unwrap()方法来解决这个问题,unwrapping mutation hook [0]给定参数返回一个您可以等待的承诺。

  • 默认情况下,如果您有一个查询循环进入一个端点,redux不会像for循环那样盲目地快速执行请求,而是逐个运行它们,因此,如果您有一个类似于我的逻辑,您应该先.unwrap(),然后await您的查询,以检测它是否失败或已解决。
const [createOneUser, { isLoading, isError, isSuccess, error }] = useCreateOneUserMutation()
const bulkUsers = [{}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}] 
const handleInsert = async()=>{
 for(const obj of bulkUsers){
    try{
        await (createOneUser(obj).unwrap()) // <--- here
    }
    catch(error){
        // ... handle error logic here
    }
 }
}
return <button onClick={handleInsert}>start bulk insert</button>

重要提示:How to break out of an async for loop on button press in React
特别感谢(markerikson)
https://github.com/reduxjs/redux-toolkit/discussions/2697#discussioncomment-3646116

相关问题