编辑后的代码和说明使内容更清晰:
我有一个传奇,调用了一个(非传奇)功能,向用户显示警报。
函数(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));
}
}
答案 0 :(得分:1)
一种选择是跳过额外的生成器间接操作,并使用Alerts回调来解决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));
}
}
答案 1 :(得分:0)
您尝试过吗:
yield call(onTapTransactionMessage);
这就是我们在sagas中调用任何函数的方式。
您可能还需要更改它:
yield call(navigation.navigate, ScreenName.ACTIVITY);