【问题标题】:Is there a better way to form this code example?有没有更好的方法来形成这个代码示例?
【发布时间】:2018-04-07 01:05:36
【问题描述】:

我是 rxjs 的新手,并且正在使用 redux-observable。简而言之,当我获得连接时,我需要发出几个承诺请求,然后输出结果。我想知道是否有一种方法可以在最后将其加入到单个地图中,而不必多次调用 store.dispatch 并为每个读取的个人重试工作。提前感谢您的 cmets。

export const handleBleConnectionSuccess = (action$,store,{bleCommunicator}) =>
  action$.ofType(c.BLE_CONNECTION_SUCCESS)
    .do((a)=>{
      Observable.fromPromise(bleCommunicator.readCharacteristic(a.device.id,gattInfo.uuid,gattInfo.firmwareRevision.uuid))
        .do((value)=>store.dispatch({type:c.DEVICE_FIRMWARE_VERSION,device:{...a.device,firmwareVersion:value}}))
        .retry(3);

      Observable.fromPromise(bleCommunicator.readCharacteristic(a.device.id,gattInfo.uuid,gattInfo.modelNumber.uuid))
        .do(value=>store.dispatch({type:c.DEVICE_MODEL_NUMBER,device:{...a.device,modelNumber:value}}))
        .retry(3);
    })
    .mapTo({type:'DEVICE_INFORMATION_REQUESTED'});

【问题讨论】:

  • 这真的取决于状态更新副作用是真的需要还是要按顺序,我用rxjs越多我觉得redux不太有用
  • 我确实需要两次调用的结果来读取它,但并不真正需要请求的 mapto 设备信息。
  • 您的模式已经很有意义且直截了当,可以考虑使用 forkjoin 并在末尾添加结果数组 learnrxjs.io/operators/combination/forkjoin.html

标签: promise rxjs rxjs5 redux-observable


【解决方案1】:

我想知道是否有一种方法可以在最后将其加入到单个地图中,而不必多次调用 store.dispatch 并为每个读取的人重试工作

是的,有更好的方法,并且可以做你想做的事。
从语法来看,我猜你使用的是ngrx(效果)(而不是redux-observable)。

所以使用 ngrx/effects 你可以这样做:

export const handleBleConnectionSuccess = (
  action$,
  store,
  { bleCommunicator }
) =>
  action$.ofType(c.BLE_CONNECTION_SUCCESS).switchMap(a => {
    const readCharacteristic = deviceOrFirmwareUuid =>
      bleCommunicator.readCharacteristic(a.device.id, gattInfo.uuid, deviceOrFirmwareUuid);

    return Observable.merge(
      readCharacteristic(gattInfo.firmwareRevision.uuid)
        .map(value => ({
          type: c.DEVICE_FIRMWARE_VERSION,
          device: { ...a.device, firmwareVersion: value },
        }))
        .retry(3),

      readCharacteristic(gattInfo.modelNumber.uuid)
        .map(value => ({
          type: c.DEVICE_MODEL_NUMBER,
          device: { ...a.device, modelNumber: value },
        }))
        .retry(3),

      { type: 'DEVICE_INFORMATION_REQUESTED' }
    );
  });

【讨论】:

  • 感谢您的详细回答,但我实际上正在使用 redux observable epics 和 rxjs5。我会看看合并是否会处理承诺,因为读取特征返回一个。
  • 是的,大多数运营商都可以直接处理 Promise ;)
  • 在你的史诗(又名效果,在 ngrx 中)内部,redux-observable 和 ngrx/效果之间几乎没有区别,因为它只是你碰巧使用动作的惯用 RxJS。我们都提供了相同的 ofType 运算符,以使这更容易。
猜你喜欢
  • 2020-03-14
  • 2012-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多