我正面临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秒钟。
您能帮我吗?
答案 0 :(得分:0)
两个代码块不可比较。在Redux saga中,您在两个点(收益率)处暂停执行,这意味着它可能需要任何时间,具体取决于正在运行的 other 生成器(sagas)将控制权返回给已暂停的生成器。一旦您yield
,就由消耗yielded
事件的对象决定是否以及何时继续从生成器中消费,因此5秒钟的延迟表明,许多其他代码被赋予了优先级。>
另外,yield delay(200)
当然会使您的传奇花费的时间超过5毫秒。
这种生成器的行为是为什么在Redux传奇中您确实应该在任何地方都没有阻塞代码的原因。