reactjs - 如何使用 rxjs 表示法向动作触发器 react-redux 添加延迟
问题描述
我有一个由动作 sendSMS 触发的按钮,然后该动作触发效果 SendSMSEffect。在这种情况下,我想禁用 sendSms 按钮 5 秒,但是,setTimeout 似乎永远不会触发最后一个动作“setDisabled”
export const sendSMSEffect:
Epic<IFluxPayloadAction<any, string>, any, IAppState>
= (action$, state$) =>
action$.pipe(
ofType(SMSActions.SendSMS),
map((action) => action.payload),
map((payload) => {
const mobile:string = getMobilePhoneFromPersonalDetails(state$.value);
return {mobile, smsType:payload};
}),
switchMap((payload) => {
const smsSelector = getSmsDetailsSelector(state$.value);
const smsContent = retrieveSms(payload.smsType, smsSelector);
return concat(
of(showLoader(sms.sendingSMS)),
from(sendSMSService(smsContent, payload.mobile, true)).pipe(
switchMap((response:ISMSResponse) => {
const wasSMSSent = response.Sent === 'Y' ? true : false;
if (payload.smsType === smsType.Validation) {
return concat(of(wasValidationSMSSent(wasSMSSent)), of(updateSMSValidationRetry()));
})),
***of(setTimeout(() => setDisabled(false), 5000)),***
of(hideLoader(sms.sendingSMS)),
);
}));
解决方案
尝试使用 rxjs 中的计时器运算符。
export const sendSMSEffect:
Epic<IFluxPayloadAction<any, string>, any, IAppState>
= (action$, state$) =>
action$.pipe(
ofType(SMSActions.SendSMS),
map((action) => action.payload),
map((payload) => {
const mobile:string = getMobilePhoneFromPersonalDetails(state$.value);
return {mobile, smsType:payload};
}),
switchMap((payload) => {
const smsSelector = getSmsDetailsSelector(state$.value);
const smsContent = retrieveSms(payload.smsType, smsSelector);
return concat(
of(showLoader(sms.sendingSMS)),
from(sendSMSService(smsContent, payload.mobile, true)).pipe(
switchMap((response:ISMSResponse) => {
const wasSMSSent = response.Sent === 'Y' ? true : false;
if (payload.smsType === smsType.Validation) {
return concat(of(wasValidationSMSSent(wasSMSSent)), of(updateSMSValidationRetry()));
})),
timer(5000).pipe(take(1))subscribe(() => of(setDisabled(false))); <------------ LIKE THIS
of(hideLoader(sms.sendingSMS)),
);
}));
推荐阅读
- java - addListenerForSingleValueEvent 监听器方法后数组列表变为空
- keras - 在keras中使用标签powerset时如何传递纪元和批量大小
- excel - 如何使用此代码将范围更改为 AC?
- java - java 类如何以相同的方法名扩展另一个类并同时实现接口
- java - java.lang.Error:未解决的编译问题:specialChr 和小写无法解析为变量
- android - 当尝试将 byteArray 写入文件时,它会转换 0B png 文件,无法获取有效文件
- numbers - 在聚合物 3 中用点替换数字的交替 2 位数字
- c++ - 如何在窗口外绘制图形(OpenGL glfw)
- html - 是否可以在 django 中循环自定义模型表单?
- angular - Angular 应用程序中的状态是什么意思?