从yield put设置redux状态...需要很多时间

时间:2019-01-19 11:24:02

标签: react-native redux redux-saga

我正面临React Native,来自Redux Saga的更新状态。    后面是来自Saga的代码调用,仅用于将标志设置为“ true / false”。    设置数据大约需要3-5秒。

    console.log(`Start loading flag...`);
    yield put(authActions.setAuthIsLoading(true));
    yield delay(200);

    endTime = new Date();
    diff = moment.duration(endTime - startTime);
    console.log(`Set loading flag, it take ${diff}...`);
    startTime = endTime;

-----------------结果是5秒

authActions.setAuthIsLoading

的代码
[types.SET_AUTH_IS_LOADING]: (state, action) => {
        var start = new Date();
        console.log('Set auth busy - Start');
        const { payload } = action;
        let result = state;
        if (state.isLoading !== payload)
        {
            result = state.merge({ isLoading: payload });
        }
        var end = new Date();
        var diff = moment.duration(end-start);
        console.log(`Set auth busy - End - Total: ${diff}(ms)`);    
        return result;
    },

----大约需要几毫秒(最多5毫秒)

我真的很困惑,设置代码块功能仅需5毫秒,但通过 yield put(authActions.setAuthIsLoading) 调用,最多需要5秒钟。

您能帮我吗?

1 个答案:

答案 0 :(得分:0)

两个代码块不可比较。在Redux saga中,您在两个点(收益率)处暂停执行,这意味着它可能需要任何时间,具体取决于正在运行的 other 生成器(sagas)将控制权返回给已暂停的生成器。一旦您yield,就由消耗yielded事件的对象决定是否以及何时继续从生成器中消费,因此5秒钟的延迟表明,许多其他代码被赋予了优先级。

另外,yield delay(200)当然会使您的传奇花费的时间超过5毫秒。

这种生成器的行为是为什么在Redux传奇中您确实应该在任何地方都没有阻塞代码的原因。