网站搜索

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);