redux RTK查询:使用`onQueryStarted`不工作时`await`

643ylb08  于 2023-08-05  发布在  其他
关注(0)|答案(1)|浏览(102)

我正面临一个奇怪的问题。
我的全局状态中有一个对象,需要用3个不同的API端点调用填充。
所以我选择用onQueryStarted方法设置一个特定的查询。
并在此方法中一起进行3个API调用。
以下是来自api.ts服务的endpoints

{
    scenario: builder.query({ query: ({theid}) => `scenarios/${scenarioId}`}),
    milestones: builder.query({ query: ({theid}) => `scenarios/${scenarioId}/ml`}),
    groups: builder.query({ query: ({theid}) => `scenarios/${scenarioId}/pg`}),

    setCurrentScenario: builder.query({
        query: id => `scenarios/${id}`, 
        async onQueryStarted (id, { dispatch, queryFulfilled, getState }) {
            try {
                let ml = await api.endpoints.milestones.initiate({theid: id})(dispatch, getState, "api")
                let pg = await api.endpoints.groups.initiate({theid: id})(dispatch, getState, "api")
                    
                let currentScen = await queryFulfilled
                dispatch( scenarioActions.addCurrentScenario( currentScen.data ))
                dispatch( scenarioActions.addCurrentScenarioMilestones( ml.data ))
                dispatch( scenarioActions.addCurrentScenarioPlayerGroups( pg.data ))
                    
            } catch (error) {
                console.log('ERRORE IN SETCURRENTSCENARIO: ', error)
            }
}

字符串
这工作正常,但是当我测试时,我需要添加一些“睡眠”功能,尽管事实上我用awaitdispatchsetCurrentScenario端点:

describe('A single Scenario should be fetched if user is manager', () => {
    it('should populate `current` scenario after asking with its `id`', async () => {

            // this populates `state.scenarios.current` 
            await store.dispatch( api.endpoints.setCurrentScenario.initiate( 1 ) )
            
            const sleep = (time:number) => new Promise((reslv) => setTimeout(reslv, time));
            await sleep(1000)

            const currentScenario = store.getState().scenarios.current
            console.log({currentScenario})

            expect(store.getState().scenarios.current?.name).not.toBeNull()
    })
})


我不明白,如果我在那个store.dispatch()上使用await,为什么我需要睡觉?
谢谢你的帮助。

yh2wf1be

yh2wf1be1#

因为await的意思是“这样做,我们以后继续执行代码”。
其他代码(在本例中是您的测试)可以在两者之间运行。所以你的测试必须完成,直到所有的事情都完成了,所有“后来”的代码也都执行了。

相关问题