0

私は、ユーザーの特定のアクションでGPS位置の追跡を開始し、他の停止時に反応するネイティブアプリケーションを実行しています。

しかし、この時間ベースの位置トラッカーを行う正しい方法を見つけられない障害にぶつかっています。これは、パターンにとって自然ではないようです。ここに私が持っていたアイデアがあります:

  1. を使用して非同期として扱いredux-thunkます。
  2. redux-observable時限イベントを使用します。
  3. を使用しsagasます。
  4. SetTimeout私の中で使用しますcomponent(これは最も簡単な解決策ですが、ユーザーがナビゲートするのを止めたくありません。これがUIの責任であるとは思いません)
4

1 に答える 1

0

したがって、これを将来の参考として残しておきます。この質問を書いているときにようやく機能した簡単な解決策です。

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
    }
}

したがって、これはスケーラブルではない可能性があり、またはepicsの下で使用する必要があるかもしれないことを理解しています. この 2 で私が直面した困難は次のとおりです。redux-observablesagas

  • clearを使用するredux-observableと、定期的なイベントが明確ではありませんでした (または一時停止するための回避策のように見えました)。
  • を使用sagasすると、スケーリングや集計が簡単に見えません。

これredux-observablesが私が手に入れたコードです。誰かがこの種のケースについて良いアイデアを持っているなら、私はそれについて聞きたいです:):

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

レポhttps://github.com/redux-observable/redux-observable/issues/168で作成した質問の Jay Phelps に感謝します。

于 2017-01-08T13:37:45.470 に答える