每次更新服务B中的功能B时如何更新serviceA中的observable?

时间:2018-04-16 13:46:20

标签: angular rxjs observable

我知道我应该使用Observable来创建这种行为。但不确定究竟该怎么做。

serviceA.service.ts

private tobeUpdated: Observable<any>;

constructor( private serviceB: serviceB){}

// Whenever any change happens in function B of serviceB, call this function

this.tobeUpdated = this.serviceB.B();
this.tobeUpdated.subscribe((data) => {
     //do my operations
})

serviceB.service.ts

    private message:[];

   B(){
        message.push("I updated this variable");
      // Now i need to pass this message to service A
      return message;
   }

现在,无论何时在服务B中更新功能B,如何更新serviceA中的“tobeUpdated”变量。

每次调用函数B时都应该更新。

我是棱角分明的新人,我们将不胜感激。

提前致谢!

3 个答案:

答案 0 :(得分:1)

使用主题。

主题如果您不想保留第一个值, BehaviorSubject 如果您需要第一个值。

服务B

// Either of them but not both, duh
toUpdate: Subject<any> = new Subject();
toUpdate: BehaviorSubject<any> = new BehaviorSubject(null);

B() {
  this.toUpdate.next('Your message or your array of messages');
}

服务A

constructor(B: serviceB) {
  B.toUpdate.subscribe(message => {
    // Your operations
  });
}

答案 1 :(得分:1)

你可以通过以下方式做到:

  1. 在serviceB内导入serviceA。
  2. 在ServiceA中,将toBeUpdated变量设为public或具有可由serviceB调用的set()方法。
  3. 在serviceB的构造函数中创建/注入serviceA。

  4. 使用步骤2中获取的对象,调用适当的方法(toBeUpdated of serviceA)。

  5. 我看不到你的实际课程名称,但第3步和第4步可以如下。这假设toBeUpdated不是私有的

    constructor(private objserviceA :   
    ServiceA) { }
     // step 4 below
     this.objserviceA.toBeUpdated =xyz
    

    在本教程中,他们将MessageService注入HeroService。

    https://angular.io/tutorial/toh-pt4

答案 2 :(得分:1)

您应该使用主题并订阅它。还要记得取消订阅。

这可能是一个例子

从&#39; rxjs&#39;;

导入{Observable}
import {Subject} from 'rxjs';
import {Subscription} from 'rxjs';

export class ClassA {
  private tobeUpdated: Observable<string>;
  private subscription: Subscription;

  constructor( private serviceB: ServiceB){
    this.tobeUpdated = this.serviceB.B();
    this.subscription = this.tobeUpdated.subscribe(data => {
       //do my operations
       console.log('the messagge received is ', data);
    })
  }

  stop() {
    this.subscription.unsubscribe();
  }
}

class ServiceB {
  private message$: Subject<string> = new Subject<string>();

  emitMessagge(message: string) {
    this.message$.next(message);
  }

  B() {
    return this.message$.asObservable();
  }

}

const B = new ServiceB();
const A = new ClassA(B);

B.emitMessagge('first');
B.emitMessagge('second');
B.emitMessagge('third');

A.stop();