我正面临React Native,来自Redux Saga的更新状态。 后面是来自 Saga 的代码调用,仅用于将标志设置为"真/假"。 设置数据需要 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.setAuthIsLoad) 调用,它最多需要 5 秒......
你能帮我吗?
这两个代码块没有可比性。在 Redux 传奇中,您在两个点(产量)暂停执行,这意味着可能需要任何时间,具体取决于正在运行的其他生成器(sagas)将控制权返回给挂起的生成器。一旦你yield
由消耗yielded
事件的任何因素来决定是否以及何时继续从生成器使用,因此 5 秒的延迟表明许多其他代码被优先考虑。
此外,yield delay(200)
当然会让你的传奇花费超过 5 毫秒的时间。
生成器的这种行为就是为什么在 Redux 传奇中,你真的、真的不应该在任何地方都有阻塞代码。