【问题标题】:yielded put action not dispatched to store in callback产生的 put 动作未调度存储在回调中
【发布时间】:2019-12-28 22:05:12
【问题描述】:

编辑代码和解释以使事情更清楚:

我有一个 saga,它调用一个(非 saga)函数,向用户显示警报。
该函数 (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));

  }
}

【问题讨论】:

  • showInAppTransaction 怎么称呼?你确定它是通过 saga 中间件运行的吗?

标签: typescript react-native generator redux-saga


【解决方案1】:

你试过了吗:

yield call(onTapTransactionMessage);

这就是我们在 sagas 中调用任何函数的方式。

您可能还需要更改此设置:

yield call(navigation.navigate, ScreenName.ACTIVITY);

【讨论】:

  • afaik 调用用于异步操作,onTapTransactionMessage() 和 navigation.navigate(ScreenName.ACTIVITY) 都是同步的。只是因为我尝试使用 call 但得到相同的结果(yield navigation.navigate(ScreenName.ACTIVITY); 从未被调用)
  • 我编辑了代码以使问题更加清晰。调用了 yield put(showReceiveDialog(false)) 但实际上没有将任何操作分派到商店。如果我执行像 navigation.navigate(ScreenName.ACTIVITY) 这样的普通函数(不是 redux),它就可以正常工作。我认为问题在于在这种情况下访问商店,但我不知道如何解决这个问题。
  • 您要发送什么操作?
  • 这看起来像是一个函数,而不是一个更新商店的动作。你在哪里导入那个函数,或者它的代码是什么?
【解决方案2】:

一种选择是跳过额外的生成器间接并使用警报回调来解决承诺。

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

  }
}

【讨论】:

  • 就是这样。谢谢!
猜你喜欢
  • 2020-03-13
  • 2019-05-01
  • 2017-11-03
  • 1970-01-01
  • 2013-06-17
  • 2023-01-30
  • 2011-01-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多