2017-01-08 4 views
0

Ich mache eine Reaktion native Anwendung, die auf bestimmte Aktion des Benutzers GPS-Position zu verfolgen, und auf andere stoppen.Wie wiederhole ich Ereignisse in react/react-native mit Redux?

Aber ich treffe eine Straßensperre, die nicht den richtigen Weg findet, diesen zeitbasierten Positionstracker zu machen, da es für das Muster nicht natürlich erscheint. Hier sind die Ideen, die ich hatte:

  1. behandeln es als async redux-thunk verwenden.
  2. Verwenden Sie redux-observable zeitgesteuerte Ereignis.
  3. Verwenden Sie sagas.
  4. Verwenden SetTimeout in meinem component (ist die einfachste Lösung, aber ich will nicht von der Navigation um meine Benutzer zu stoppen, und ich nicht, was dies ist ein responsability UI)

Antwort

0

Ich werde verlassen Also dieses als referenz für die zukunft, mit der einfachen lösung habe ich endlich gearbeitet, während ich daran arbeitete, diese frage zu schreiben.

import * as types from './types' 
var gpsGetInterval 
export function startLocationTracking(time = 1000){ 
    return dispatch => { 
      gpsGetInterval = setInterval(() =>{ 
       navigator.geolocation.getCurrentPosition(
       (position) => { 
        dispatch({ 
         type: types.NEW_POSITION, 
         state: JSON.stringify(position) 
        }) 
       }) 
      }, time) 
      dispatch({ 
       type: types.START_RUN 
      }) 
     } 
} 

export function stopLocationTracking(){ 
    clearInterval(gpsGetInterval) 
    return { 
     type: types.STOP_RUN 
    } 
} 

So verstehe ich, dass dies nicht skalierbar sein könnte und man könnte epics unter redux-observable oder sagas verwenden müssen. Die Schwierigkeit, die ich in diesem 2 konfrontiert, wo:

  • redux-observable klar die wiederkehrendes Ereignis mit war nicht klar (oder sah aus wie eine Abhilfe zu Art es von einer Pause).
  • mit sagas scheint nicht einfach zu skalieren oder zu aggregieren.

Mit redux-observables hier ist der Code i Art von bekam, wenn jemand eine gute Idee für diese Art von Fall hat, wird Ich mag davon hören :):

export function inStartRun(action$){ 
    return action$.ofType(types.START_RUN) 
    .switchMap(function() { 
     Rx.Observable 
     .interval(1000) 
     .do(function() { console.log('tick...') }) 
     .share() 
     .mapTo({ type: types.STOP_RUN}) 
    }); 
} 

Besonderer Dank Jay Phelps in der Frage, die ich im Repo https://github.com/redux-observable/redux-observable/issues/168

gemacht habe