Как подписаться с учетом наблюдаемой функции с помощью params - PullRequest
0 голосов
/ 01 марта 2020

У меня есть функция с произвольными параметрами наблюдаемого, которая выполняет какую-то работу. Я хочу подписаться на эту тему, у которой есть другие какие-то подписки (для make all, вызванные для вызываемых функций).

Я не могу найти способ сделать это правильно.

Мой сервис:

//The method of the observable 
addProduct2(product: Product) {     
  delete product.id;
  const url = 'http://localhost:8080/createProduct';
  return this.http.post<Product>(url, product);
}

Я хочу, чтобы это работало:

getProductsEvent:Subject<Product> = new Subject();

constructor(private http: HttpClient, private currentRoute: ActivatedRoute) {
  //....
  this.addProduct2.subscribe(this.getProductsEvent);
}

Я получаю эту ошибку компиляции:

ОШИБКА в src / app / components / products-feature / data-service.service.ts (42,22): ошибка TS2339: Свойство «подписка» не существует для типа «(product: Product) => Observable».

и в журналах:

AppComponent. html: 3 ОШИБКА TypeError: this.addProduct2.subscribe не является функцией в новом DataServiceService (data-service.service. ts: 42) ...

Как мне этого добиться? Что мне не хватает?

помните, что я не могу вызвать

this.addProduct2().subscribe...; 

, потому что у него есть параметры, и я не знаю, какие параметры он получит.

1 Ответ

1 голос
/ 01 марта 2020

Если вы хотите отправлять событие каждый раз, когда создается новый продукт, вы должны позвонить на следующий номер вашего productsEvent Subject.

private productEvent: Subject<Product> = new Subject(); 

public getProductsEvent(); Subject<Product> {
  return this.productEvent;
}

public addProduct(product: Product): Observable<Product> {
  delete product.id;
  const url = 'http://localhost:8080/createProduct';
  return this.http.post<Product>(url, product).pipe(
    tap((product: Product) => this.productEvent.next(product)),
  );
}

Я использовал трубу и оператора ответвления, чтобы вызвать следующий после того, как новый продукт будет возвращен из вашего запроса HTTP. Метод addProduct возвращает наблюдаемое, что означает, что ничего не произойдет, пока вы не подпишетесь на него.

При такой настройке вы можете использовать ее следующим образом:

Где-то вы можете добавить товар, вызвав метод и подписавшись.

addProduct(data).subscribe();

И где бы вы ни подписались на событие, вы получите уведомление:

getProductsEvent().subscribe((addedProduct: Product) => {
  // Do something with the added product
  console.log(addedProduct)
});

Примечание Я сохранил типы, как в вашем вопросе, но мне интересно, совпадает ли тип публикуемых вами данных Product с типом ответа, также Product, но, думаю, вы знаете свой Типы объектов лучше, поэтому я оставил все как есть.

...