是否有可能以一种我可以不断反馈的方式使用Observable?

时间:2017-05-26 06:40:25

标签: angular rxjs observable

假设我订阅了一个可观察的

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只会在最后返回。但是如果我不想等待怎么办 - 如果我只是想看看最好的路段是什么时候呢?

是否可以使用Observables?我正在寻找下面的东西......

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

3 个答案:

答案 0 :(得分:0)

听起来像你在描述一个subject。这既是观察者又是观察者,因此您可以订阅它并将新数据推入其中。

//in initialize() method of your ot_table:
$this->hasOne("table_details")
    ->setForeignKey("user_id")
    ->setBindingKey("user_id");

请注意,主题本身是私有的,然后通过只读的observable公开公开。该方法现在只是完成计算路线的过程的触发器,因此消费者看起来像:

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

我在我的博客上写了一篇关于我们如何将这种模式用于可能提供一些背景信息的HTTP服务的文章:http://blog.jonrshar.pe/2017/Apr/09/async-angular-data.html

答案 1 :(得分: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

答案 2 :(得分: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();
  })
}