有没有更好的方法来形成这个代码示例?

时间:2017-10-25 19:47:30

标签: promise rxjs rxjs5 redux-observable

我是rxjs的新手并使用redux-observable。缺点是,当我获得连接然后输出结果时,我需要做几个承诺请求。我想知道是否有一种方法可以将其加入到最后的单个地图中,而不必多次调用store.dispatch并对每个单独的读取进行重试。提前感谢您的意见。

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

1 个答案:

答案 0 :(得分: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' }
    );
  });