Redux / Saga:如何在无通道的情况下在回调内触发操作(放置)(使用sagas作为常规生成器功能)

时间:2019-01-29 13:11:11

标签: react-native callback action redux-saga saga

我正在寻找一种从回调内部触发操作的方法。我知道默认情况下这是不可能的,但我正在寻找解决方法。就我而言,渠道是一个糟糕的解决方案(到目前为止,我仍然看到它)。

我使用的图书馆是react-native-ble-plx。在该库中,有一个开始扫描的功能:startDeviceScan(UUIDs, options, listener)

为了保持整洁,我想从侦听器中断开开始/停止扫描(因此无法使用频道)。

在获得此解决方案之前:

const onScanChannel = () => eventChannel(emit => {
  BleService.startDeviceScan(..., ..., (peripheral) => {
      emit(peripheral);
    }
  );

  return () => {BleService.stopScan();}
});

问题是这将通道与扫描的开始和结束连接起来。这会导致您连接大量Sagas,因为您需要从应用程序逻辑中开始和停止扫描(取消频道,再次设置,开始新的传奇以收听新频道等)

我想到的是使用sagas作为正常的发电机功能:

const startScanSaga = function* () {
  BleService.scan(..., ..., (peripheral) => {
    const generator = deviceFoundHandler(peripheral);
    generator.next();
    generator.next();
  });
};

const deviceFoundHandler = function* (peripheral) {
  yield put(actions.deviceFound(peripheral));
};

这样,监听被发现设备动作的传奇故事就可以继续运行。但是,尽管看跌期权的执行正确,但是没有任何看跌期权会收到该操作,这表明如果没有幕后的传奇逻辑,看跌期权是行不通的。

有人对此有更多了解吗?还是有人有替代方法来实现这一目标?

1 个答案:

答案 0 :(得分:1)

我设法使用middleware.run(saga, ...args)解决了问题。

我需要导出sagaMiddleWare:export const sagaMiddleware = createSagaMiddleware();

import {sagaMiddleware} from '.../file-where-sagaMiddleWare-is-exported';

const startScanSaga = function* () {
  BleService.scan((peripheral) => {
    sagaMiddleware.run(deviceFoundHandler, peripheral);
  });
};

const deviceFoundHandler = function* (peripheral) {
  yield put(actions.deviceFound(peripheral));
};

像魅力一样工作=)