我正在寻找一种从回调内部触发操作的方法。我知道默认情况下这是不可能的,但我正在寻找解决方法。就我而言,渠道是一个糟糕的解决方案(到目前为止,我仍然看到它)。
我使用的图书馆是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));
};
这样,监听被发现设备动作的传奇故事就可以继续运行。但是,尽管看跌期权的执行正确,但是没有任何看跌期权会收到该操作,这表明如果没有幕后的传奇逻辑,看跌期权是行不通的。
有人对此有更多了解吗?还是有人有替代方法来实现这一目标?
答案 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));
};
像魅力一样工作=)