С помощью машинописи, что такое хороший тип Observable для наилучшего представления ответа HTTP без содержимого? - PullRequest
0 голосов
/ 17 октября 2018

Используя машинопись, Angular 6+ и rxjs, как наилучшим образом представить вызывающей стороне, что содержимое ответа HTTP пусто (Content-Length = 0)?

Без указания типов в вызове метода (get, post и т. Д.), Возвращается Observable<Object>, что вводит в заблуждение относительно содержания ответа, поскольку можно поддаться искушению использовать данный объект:

let response: Observable<Object> = httpClient.post('...');
response.subscribe(o => ...);

В этом случае o всегда равно нулю, но это не является явным и не проверяется компилятором.

Лучшим решением было бы вернуть Observable<null>, но я считаю семантику неоднозначной, поскольку нуль может также ссылаться на нульданные (например, для клиента без номера телефона свойство phoneNumber будет иметь значение NULL).

Ответы [ 3 ]

0 голосов
/ 17 октября 2018

Вы можете создать метод для отправки запроса как Observable, например:

 // Add a new comment
    addComment (body: Object): Observable<Comment[]> {
        let bodyString = JSON.stringify(body); // Stringify payload
        let headers      = new Headers({ 'Content-Type': 'application/json' }); // ... Set content type to JSON
        let options       = new RequestOptions({ headers: headers }); // Create a request option

        return this.http.post(this.commentsUrl, body, options) // ...using post request
                         .map((res:Response) => res.json()) // ...and calling .json() on the response to return data
                         .catch((error:any) => Observable.throw(error.json().error || 'Server error')); //...errors if any
    }   

    // Update a comment
    updateComment (body: Object): Observable<Comment[]> {
        let bodyString = JSON.stringify(body); // Stringify payload
        let headers      = new Headers({ 'Content-Type': 'application/json' }); // ... Set content type to JSON
        let options       = new RequestOptions({ headers: headers }); // Create a request option

        return this.http.put(`${this.commentsUrl}/${body['id']}`, body, options) // ...using put request
                         .map((res:Response) => res.json()) // ...and calling .json() on the response to return data
                         .catch((error:any) => Observable.throw(error.json().error || 'Server error')); //...errors if any
    }   

    // Delete a comment
    removeComment (id:string): Observable<Comment[]> {
        return this.http.delete(`${this.commentsUrl}/${id}`) // ...using put request
                         .map((res:Response) => res.json()) // ...and calling .json() on the response to return data
                         .catch((error:any) => Observable.throw(error.json().error || 'Server error')); //...errors if any
    }

Или просто использовать HttpClient, например:

getConfigResponse(): Observable<HttpResponse<Config>> {
  return this.http.get<Config>(
    this.configUrl, { observe: 'response' });
}

    addHero (hero: Hero): Observable<Hero> {
  return this.http.post<Hero>(this.heroesUrl, hero, httpOptions)
    .pipe(
           catchError(this.handleError('addHero', hero))
         );
    }
0 голосов
/ 17 октября 2018

То, что вы ищете, действительно существует, и его правильный тип - Observable<void>.Как вы сказали, null - это обычное значение, которое может быть получено любым Наблюдаемым.В RxJS 6 это представлено empty(), которое похоже на любое другое наблюдаемое, но не генерирует никакого значения next и просто отправляет сигнал complete.

import { empty, EMPTY } from 'rxjs';

empty().subscribe(...) // will receive just the `complete` notification

// or you can use EMPTY

EMPTY.subscribe(...)

Кстати, вы можететакже можно превратить любое Наблюдаемое в Observable<void>, используя оператор ignoreElements().

Есть также never() и NEVER Наблюдаемые, но не принимайте их за empty(), потому что они ничего не излучают(даже не уведомление complete).

0 голосов
/ 17 октября 2018

Вы можете использовать Observable.empty()

или

empty(), если вы импортировали из rxjs

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...