typescript - 产生的 put 动作未调度存储在回调中
问题描述
编辑代码和解释以使事情更清楚:
我有一个传奇,它调用一个(非传奇)函数,向用户显示警报。
函数 (Alerts.showInAppMessage) 接受一个 onTap 函数,当用户点击警报时将调用该函数。我无法将 yield put(showReceiveDialog(false)) 作为回调传递,因为它是一个生成器。但是,我设法通过保存对生成器的引用并在其上调用 .next() 来在用户点击后调用 yield put(showReceiveDialog(false)) 行(见下文)。代码按预期顺序调用,但操作不会分派到商店。
let showInAppTransactionGenerator: IterableIterator<any>;
function* showInAppTransaction(alert: PushAlert) {
if (alert.body && alert.title){
yield Alerts.showInAppMessage(alert.title, alert.body, () => {
showInAppTransactionGenerator.next();
});
yield put(showReceiveDialog(false));
}
}
解决方案
一种选择是跳过额外的生成器间接并使用警报回调来解决承诺。
function showInAppMessage(title, body) {
return new Promise(resolve => {
Alerts.showInAppMessage(alert.title, alert.body, () => {
resolve();
});
});
}
function* showInAppTransaction(alert: PushAlert) {
if (alert.body && alert.title){
yield call(showInAppMessage, alert.title, alert.body);
yield put(showReceiveDialog(false));
}
}
推荐阅读
- javascript - Redux Saga EventChannel: TypeError: (0, _reduxSaga.take) 不是函数
- android - Android:文本超过一行的TextView不可点击/长点击
- typescript - TypeScript:对象作为类属性(非静态或静态)
- django - 我在 /admin/login/ 处不断收到 RelatedObjectDoesNotExist。如何通过一对一关系在 Django 中成功创建用户配置文件?
- bootstrap-4 - 如何在 bundle.js 中使用元名称?
- python - Python 格式整数
- java - .getResource 在资源文件夹中找不到文件
- ios - iOS 8 - 当应用程序不活动时显示来电(没有 CallKit)
- php - 有没有办法让这些查询更短?
- ruby - 方法级联在这里是可能的吗?