如何使用eventChannel将函数传递给redux-saga中的回调

时间:2019-08-06 21:28:14

标签: javascript redux redux-saga channels saga

我有redux-saga,它在当前会话等方面产生了很多东西  在这个传奇中的一个生成器函数中,我有一个看起来像这样的地方:

setSessionFailureHandler(() => {
  yield openMFAModal(account);
});

setSessionFailureHandler是第三方SDK,我需要在其中传递回调。 openMFAModal是打开模态窗口的redux操作。 我正在使用3-d第三方SDK的回调函数,该函数应处理会话失败并打开模式窗口。 当然,我不能在回调中使用yield,这就是为什么我尝试使用eventChannel功能的原因,我为看起来像这样的通道创建了一个新函数:

function setSessionFailureChannel(data) {
  return eventChannel((emitter) => {
    setSessionFailureHandler(() => {
      const { function, account } = data;
      return emitter(function(account));
    });
  });
}

在另一个生成器中,我试图用回调函数调用此函数,但老实说,我不清楚如何做到这一点,我在eventChannel上看到的所有示例都集中在通过callBack将数据传递给您的传奇的想法上,但是我需要以某种方式将我的操作传递给回调,该回调将在处理会话失败后调用它。

我正试图将我的操作和该操作的参数从生成器传递给该函数,如下所示:

const setSessionFailure = yield call(setSessionFailureChannel, { func: openMFAModal, account });
while (true) {
   yield call(setSessionFailure);
}

我知道这是错误的方法,也许有人以某种方式做了相同的技巧,并且可以解释如何做到这一点?

1 个答案:

答案 0 :(得分:1)

您需要从该频道yield take开始,诸如此类:

const setSessionFailureChan = yield call(setSessionFailureChannel, { func: openMFAModal, account });
while (true) {
   // the channel yields actions due to the way you've structured the emitter
   const openMFAModalAction = yield take(setSessionFailureChan);
   // then you need to dispatch those actions
   yield put(openMFAModalAction);
}

这是假设您在解构setSessionFailureChannel时更新了func代码以使用function而不是data的情况,