Размещать данные в API с подпиской или без - PullRequest
0 голосов
/ 21 февраля 2019

В Angular 7 я получаю и публикую данные из API.

GET

  • Для получения данных я использую Observable (posts $)и труба / карта;
  • Я использую async в компонентном HTML и не использую Subscribe ;
  • Это подход, который я видел недавно, в том числе в Angular Docs.

POST

  • Метод Service Post также возвращает данные:
    Возможные ошибки проверки или идентификатор созданного сообщения.
    Мне нужно получить любой из них, когда они возвращаются API.

Однако при вызове службы POST следующие действия ничего не делают:

this.postService.addPost(model).pipe();

Если я не использую subscribe следующим образом:

this.postService.addPost(model).pipe().subscribe();

Вопрос Как я могу публиковать в API без использования подписки?И имеет ли это смысл?

Компонент

export class PostComponent implements OnInit {

  posts$: Observable<GetPostsModel[]>;

  constructor(private postService: PostService) { }

  ngOnInit() {
    this.posts$ = this.getPosts();
  }

  addPost(model: AddPostModel) {

    this.postService.addPost(model).pipe().subscribe();

  }

  getPosts(): Observable<GetPostsModel[]> {

    return this.postService.getPosts().pipe(

      map((response: GetPostsResponse) => 

        return {
          // Map Response to GetPostsModel here 
        };

      }));

  }

}

Сервис

export class PostService {

  constructor(private httpClient: HttpClient) { }

  public addPost(model: AddPostModel): Observable<AddPostResponse>> {

    const headers = new HttpHeaders({ 'Content-Type': 'application/json' });

    return this.httpClient.post<AddPostResponse>>('posts', model, { headers: headers });

  }

  public getPosts(): Observable<GetPostsResponse>> {
    return this.httpClient.get<GetPostsResponse>>('posts');
  }

}

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

Observable, возвращаемое любой из операций Http (get / post / put / etc) требует подписку.

Но в некоторых случаях Angular автоматически обрабатывает эту подписку для вас.

Например:

  • Использование асинхронного канала автоматически подпишется на возвращаемое наблюдаемое.

  • Использование распознавателя маршрутов автоматически подпишется на возвращаемую наблюдаемую информацию.

В любом другом случае, например, в вашем Посте, вам необходимо подписаться.

ОБНОВЛЕНИЕ

Вам нужно только добавить pipe, если вам нужно передать ответ через набор операторов.Обычно вы, по крайней мере, захотите оператор catchError.Я часто добавляю tap во время разработки только для целей отладки, но это не обязательно.

Вот пример одной из моих операций Post:

  createProduct(product: Product): Observable<Product> {
    const headers = new HttpHeaders({ 'Content-Type': 'application/json' });
    return this.http.post<Product>(this.productsUrl, product, { headers: headers })
      .pipe(
        tap(data => console.log('createProduct: ' + JSON.stringify(data))),
        catchError(this.handleError)
      );
  }

Я не частосм. использование pipe в коде клиента.Для «разделения интересов» обычно отображение / манипулирование данными выполняется в службе ... если только не требуется что-то уникальное для компонента.

Но только это:

this.postService.addPost(model).pipe().subscribe();

Передача без ответа от некоторых операторов ничего не делает.

0 голосов
/ 21 февраля 2019

Как мне публиковать в API без использования подписки?

Вы не можете, вы всегда должны подписаться.Если вас не волнует результат, вам не нужно предоставлять ответный звонок.Это совершенно верно:

this.postService.addPost(model).subscribe();

примечание: в этом случае вам не нужна пустая pipe

См. Также Angular 2 http.post () не отправляет запрос и HttpClient - Всегда подписываться! документация.

Всегда подписываться!

Метод HttpClient не делаетначинайте его HTTP-запрос до тех пор, пока вы не вызовете subscribe () для наблюдаемой, возвращаемой этим методом.Это верно для всех HttpClient методов.

...