2016-05-27 2 views
2

Observables sind neu für mich, also bin ich nicht einmal sicher, ob es möglich ist (aber ich würde es vermuten). Was ich erreichen möchte, ist eine beobachtbare (Angular 2 http.get Aufruf), und abonnieren Sie einmal immer wenn eine Variable geändert wird. Ein Beispiel fließen würde wie folgt sein:RxJS Observable - abonnieren Sie jedes Mal, wenn eine Bedingung erfüllt

let x = false; 
// ... somewhere later I change "x" to true 
subscribe gets called once, x => false 
// stuffs happening, 10 minutes later x => true again 
subscribe gets called once, x => false 

Je größer Konzept ist, dass ich ein UserService und im Konstruktor hätte ich /api/user/me einmal anmelden würde, wenn es eine Token Änderung der localstorage ist. Ist das ein gültiger Anwendungsfall, und wenn ja, wie kann ich das mit Observablen machen?

+0

Also, was Sie tun möchten, ist ein API-Aufruf (einmal) jedes Mal, wenn ein lokaler Speicher ändert sich? Nur versuchen, zu bekommen, was Sie wollen tun, damit ich eine anständige Antwort geben kann. – Nypan

+0

Yup, im Grunde das ist es. einen API-Aufruf (einmal) jedes Mal machen, wenn sich ein lokales Speicherelement ändert und es nicht null ist. – Andrew

Antwort

1

So etwas sollte es tun:

// Observable that on subscription will result in an api call. It would 
// naturaly have another type in an acaual use case. 
let apiCallObservable : Rx.Observable< { someResult: any }>; 

let localStorageChangedObservable = new Rx.Subject<boolean>() 

localStorageChangedObservable 
    // only care about local storage change if not null 
    // This is just an example the type of localStorageChangedObservable 
    // could be anything you want, and you could check anything you want in the 
    // "where" 
    .where(v => v != null) 
    .selectMany(() => 
     // Take one is to make sure we terminate apiCallObservable after recieving 
     // one result from it. 
     apiCallObservable.take(1)) 
    .subscribe(
     (result: { someResult: any}) => { 

      // here we would have the result from the call to apiCallObservable 
     }); 

// To execute the chain abouve we would pass values to the localStorageChangedObservable 
// subject like this: 

localStorageChangedObservable.onNext(true); // results in api call and result in subscribe 
localStorageChangedObservable.onNext(null); // results in nothing. 
localStorageChangedObservable.onNext(false); // results in api call and result in subscribe 

So passiert im Grunde etwas localStorageChangedObservable.onNext(...), wenn Sie einen API-Aufruf auslösen sollen.

+1

Es gibt ein Problem mit der Angabe 'Eigenschaft ', wo' existiert nicht auf Typ 'Betreff '. 'Ich denke, es ist' Filter'? – Andrew

+0

Ok, ich denke, das ist ein Problem im Zusammenhang mit eckigen 2. Du musst mehr von rxjs aufnehmen als eckig standardmäßig (ich bin kein angularer Guru). Hier ist die Rxjs Repo https://github.com/Reactive-Extensions/RxJS, um alles zu verwenden verwenden Sie die rx.all.js im Ordner dist. Und ich realisierte auch, dass ich meinen Anser in Typoskript anstelle von Javascript geschrieben habe, aber ich nehme an, du hast es trotzdem verstanden? – Nypan

+0

Ja, ich benutze Typoskript, also ist es cool, danke! Ich habe 'wo' mit' filter' und 'selectMany' mit' flatMap' ersetzt und es sieht so aus, als ob es funktioniert, aber für jede Änderung macht es 3 Anfragen, aber ich bin mir ziemlich sicher, dass das mit eckigen zusammenhängt! Danke noch einmal! – Andrew