2017-05-26 26 views
0

說我有一個訂閱可觀察到的這裏是否有可能以可持續反饋的方式使用Observables?

this.calculateService.CalculateBestRoute().subscribe(
    data => { 
    drawRoute(data); 
    } 
); 

而且說CalculateBestRoute功能需要很長的時間做,因爲有許多事情它,但同時它在做這些事情時,就可以得到更好更好。

public CalculateBestRoute(): Observable<Route> { 
    let bestRoute; 
    DoThing1(bestRoute); 
    DoThing2(bestRoute); 
    DoThing3(bestRoute); 
    DoThing4(bestRoute); 
    return Observable.of(bestRoute); 
} 

如果我有這個代碼,bestRoute只會在最後返回。但是如果我不想等 - 如果我只想看看最好的路線是什麼時候怎麼辦?

是否可以使用Observable?我正在尋找類似下面...

public CalculateBestRoute(observable : Observable<Route>) { 
    let bestRoute; 
    DoThing1(bestRoute); 
    observable.update(bestRoute); 
    DoThing2(bestRoute); 
    observable.update(bestRoute); 
    DoThing3(bestRoute); 
    observable.update(bestRoute); 
    DoThing4(bestRoute); 
    observable.update(bestRoute); 
} 
+0

我認爲你需要看看文檔爲['Observable.create ()'](http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#static-method-create)。你應該看到,'.next()'裏面有一個「抽新東西」的基本方法,可以觀察到一個流。你的問題可能不那麼呆板,但這似乎是你通常想說的。 –

+0

你的例子不是非常一致,但它聽起來像你描述的[主題](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/gettingstarted/subjects.md)。我寫了一篇關於我們如何使用這種模式的博客文章,如果你想了解更多信息:http://blog.jonrshar.pe/2017/Apr/09/async-angular-data.html – jonrsharpe

+0

@jonrsharpe - 謝謝你也許我所追求的甚至不是可觀察的。我會看看 – Diskdrive

回答

0

這聽起來我像你描述subject。這既是觀察者又是觀察者,因此您可以訂閱它並將新數據推入其中。

private routeSubject = new Subject<any>(); 
public route$ = this.routeSubject.asObservable(); 

public calculateBestRoute(): void { 
    let bestRoute: any; 
    DoThing1(bestRoute); 
    this.routeSubject.next(bestRoute); 
    DoThing2(bestRoute); 
    this.routeSubject.next(bestRoute); 
    DoThing3(bestRoute); 
    this.routeSubject.next(bestRoute); 
    DoThing4(bestRoute); 
    this.routeSubject.next(bestRoute); 
} 

注意,主體本身是私有的,然後通過一個只讀的觀察到的公開曝光。該方法現在只是一個觸發要經過計算路線的過程,所以消費者會看起來像:

this.service.route$.subscribe(bestRoute => { 
    ... 
}); 
this.service.calculateBestRoute(); 

我寫的一篇文章上我的博客關於我們如何使用這種模式對於HTTP可能提供一些背景的服務:http://blog.jonrshar.pe/2017/Apr/09/async-angular-data.html

0

發佈/訂閱模式可以使用Subject來實現。

以下代碼是工作演示。

interface Route { 
    length: number; 
} 

let routeSubject = new Subject<Route>(); 

function update(route:Route) { 
    routeSubject.next(route); 
} 

function doThing(route:Route) { 
    route.length++; 
} 

function calculateBestRoute(observable: Observable<Route>) { 
    let bestRoute:Route = { length: 0}; 

    doThing(bestRoute); 
    update(bestRoute); 
    doThing(bestRoute); 
    update(bestRoute); 
    doThing(bestRoute); 
    update(bestRoute); 
    doThing(bestRoute); 
    update(bestRoute); 
} 

routeSubject.subscribe(value => console.log(`updated: ${value.length}`)); 
calculateBestRoute(routeSubject); 

結果:

updated: 1 
updated: 2 
updated: 3 
updated: 4 
0

calculateBestRoute必須創建並返回一個可觀察的最佳路線:

public calculateBestRoute() { 
    return Rx.Observable.create(function(observer) { 
    let bestRoute; 
    DoThing1(bestRoute); 
    observer.onNext(bestRoute); 
    DoThing2(bestRoute); 
    observer.onNext(bestRoute); 
    DoThing3(bestRoute); 
    observer.onNext(bestRoute); 
    DoThing4(bestRoute); 
    observer.onNext(bestRoute); 
    observer.onCompleted(); 
    }) 
} 
相關問題