typescript - 在回调中产生的 put action 未分发到 store
编辑了代码和解释以使事情更清楚:
我有一个 saga,它调用了一个(非 saga)函数,该函数会向用户显示一个警告。
该函数(Alerts.showInAppMessage)接受一个 onTap 函数,当用户点击警告时会调用该函数。我不能将 yield put(showReceiveDialog(false)) 作为回调传递,因为它是一个生成器。但是,我设法通过保存生成器的引用并在用户点击后调用 .next() 来让 yield put(showReceiveDialog(false)) 这一行被调用(见下文)。代码按预期顺序被调用,但该动作并未分发到 store。
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));
}
}答案#1
一个选项是跳过额外的生成器间接调用,使用警报回调来解决一个 Promise。
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));
}
}
答案#2
你尝试过:
yield call(onTapTransactionMessage);
这就是我们在 saga 中调用任何函数的方式。
你可能也需要更改这个:
yield call(navigation.navigate, ScreenName.ACTIVITY);
