2016-02-15 15 views
5

Ben Redux farkında olmayan bir coğrafi konum hizmeti Say ve böyle yapılandırmak:Redux un habersiz servisinden nasıl bir eylem gönderilir?

backgroundGeoLocation.configure(
    callback // will be called with an argument when the coordinates change 
); 

bir Redux eylemi hizmeti geri arama sevkini yapmak için en temiz yolu nedir ayrı modülden store ihraç etmeden ve store.dispatch() kullanarak (çünkü bu bir singleton olur)?

cevap

10

JavaScript'te bir kod parçasına biraz değer vermek istiyorsanız, işlevleri kullanmanız gerekir. Sen mağazadan oluşturduğu her yerde

Şimdi
function createGeoLocationService(store) { 
    let backgroundGeoLocation = new BackgroundGeoLocation() 
    backgroundGeoLocation.configure(coordinates => { 
    store.dispatch({ type: 'UPDATE_COORDINATES', coordinates }) 
    }) 
    return backgroundGeoLocation 
} 

, o hizmeti oluşturmak
Örneğin : Eğer bileşenleri erişmek gerekiyorsa

let store = createStore(reducer) 
let backgroundGeoLocation = createGeoLocationService(store) 

, aşağıdakilerden birini yapabilirsiniz:

  1. Bir singleton yapın (yup, ne istediğinizi değil, ama sadece istemci uygulamaları için geçerli bir seçenek)
  2. Bunu yapın (Sıkıcı olsun ama en basit ve açık bir yol olabilir)
  3. (çok kolay ancak bir unstable API that is subject to change yüzden Vicdanın var ile ilgili olacak) bağlamında yoluyla örtülü olarak aşağı geçmek
+0

Not olduğunu '' react- 'dan redux, "bağlam yoluyla dolaylı olarak aktar" tekniğini kullanır, bu yüzden Redux kullanıyorsanız, zaten bilmeden "kararsız bir API ile uğraşıyorsunuz". –

+0

@AnsonKao Bu kararsız API değiştiğinde uygulamanızı değiştirmeniz gerekmez. Kullanımını sizden saklıyoruz. –

1

ise sahne aracılığıyla açıkça wn callbackFn'un 'un farkında olmak istemiyorsanız, olay akışı veya GözlemlenebilircallbackFn'dan bir şey oluşturmanız gerekir. Ve bir kez bitirdikten sonra akışı sadece store.dispatch işlevine eşlersiniz.

Sen akışı yaratmak için herhangi bir lib kullanmakta serbestsiniz ancak böyle bir şeyle gelmelidir edeceğiz ben bu yaklaşımda Rx

tavsiye:

var geoLocation$ = new Rx.Subject(); 
var newCoordinatesAction = coordinates => ({ 
    type: "YOUR_TUPE", 
    payload: coordinates 
}); 
geoLocation$.map(newCoordinatesAction).map(store.dispatch); 
backgroundGeoLocation.configure(::geoLocation$.onNext); 
İlgili konular