首页 > 解决方案 > 产生的 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));

  }
}

标签: typescriptreact-nativegeneratorredux-saga

解决方案


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

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

  }
}

推荐阅读