Подпишитесь дважды на Angular 2 Http?

Я хотел бы иметь службу для вызова API, который правильно обрабатывает запрос и выполняет стандартную обработку ошибок в запросах API. Например, у меня есть ApiErrorsService, который я хочу вызвать, когда при любом вызове API возникает ошибка. Я также хочу отправлять вызовы стандартным способом, то есть устанавливая Content-Type на application / json и сериализуя объект запроса.

Конечно, когда я подписываюсь на наблюдаемый объект, возвращаемый из Http, он вызывается один раз, а когда я возвращаю его, и вызывающий абонент подписывается, он вызывается снова. Как лучше всего отслеживать результаты в двух местах, не выполняя дважды вызов API? Могу я просто позвонить .publish() или .share() и ответить? Надо ли потом утилизировать? Могут ли возникнуть какие-либо проблемы с синхронизацией? Если я имитирую вызов API и немедленно верну значение, все будет нормально, или в подписке вызывающего абонента значения не будут? Вот код, который у меня есть:

post(path: string, data: any): Observable<Response> {
    var headers: Headers = new Headers();
    headers.set("Content-Type", "application/json");
    var s = data == null ? null : JSON.stringify(data, null, 2);
    var shared = this.http.post(path, s, { headers: headers }).share();
    shared.subscribe(null, err => this.appErrorsService.addApiError(err));
    return shared;
}

person Jason Goemaat    schedule 21.04.2016    source источник


Ответы (2)


Использование share - излишество. если вы просто хотите обработать ошибку встроенно, вы можете вместо этого использовать do:

return this.http.post(path, s, { headers: headers })
   .do(null, err => this.appErrorsService.addApiError(err));
person paulpdaniels    schedule 22.04.2016

Достаточно использовать общий доступ, http Observable завершается автоматически, поэтому вам не нужно отказываться от подписки. Невозможно пропустить значения, если вы не собираетесь подписывать второго слушателя в асинхронном методе (setTimeout / etc).

person kemsky    schedule 21.04.2016