2016-12-05 1 views
0

У меня есть AuthHttpService, который расширяет Http. Всякий раз, когда делается запрос, я возвращаю Observable, но я также хотел бы предпринять некоторые действия внутри самого HTTPService. Как я могу это сделать?Как подписаться на наблюдаемый, который должен быть возвращен, но все еще возвращает Observable

, например:

get(url: string) { 
    this.pendingRequests++; 
    return this.http.get(this.config.apiUrl + '' + url, { headers: this.getHeaders(this.config.apiUrl + url) }) 
     .subscribe(() => { 
     if (this.pendingRequests > 0) { 
      this.pendingRequests--; 
     } 
     }); 

    } 

Я использую this.pendingRequests > 0 показать загрузки кок. Я хочу передать фактический ответ на любой сервис, называемый authHttp.get(), но я хочу, чтобы authHttp управлял pendingRequests сам по себе, так как я могу что-то сделать с ним без подписки? Мои службы, которые называют этот метод, жалуются, что Property 'map' does not exist on type 'Subscription', что имеет смысл, но я не знаю, как это сделать.

Ошибка возникает, когда служба компонента вызывает AuthHttp.get, ожидая Observable, но вместо этого получает подписку. Мне интересно, есть ли способ подписаться на AuthHttp, но все равно вернуть подписку

+0

Почему не 'let myCall = this.http.get (this.config.apiUrl + '' + url, {headers: this.getHeaders (this.config.apiUrl + url)})', а затем подписаться на 'myCall 'а затем сделать карту и вернуть ее? – silentsod

+0

Вы попробовали 'switchMap'? С помощью 'switchMap' вы можете переключиться с наблюдаемого на другой, и подписчику ничего не нужно. Вы можете увидеть больше здесь https://www.learnrxjs.io/operators/transformation/switchmap.html – vinagreti

+0

@silentsod Это действительно сработало просто отлично .. –

ответ

0

Простейший способ заключается в применении «побочный эффект» через do блок

get(url: string) { 
    this.pendingRequests++; 
    return this.http.get(this.config.apiUrl + '' + url, { headers: this.getHeaders(this.config.apiUrl + url) }) 
     .do(() => { 
     this.pendingRequests = Math.max(0, this.pendingRequest - 1); 
     }); 
    } 

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

const PendingRequest = (onStart, onFinish) => { 
    onStart(); 
    return onFinish; 
} 

const defaultRequest =() => PendingRequest(
() => this.pendingRequest++, 
() => this.pendingRequests = Math.min(0, this.pendingRequests - 1) 
); 

get(url: string) { 
    return Observable.using(
    defaultRequest, 
    pendingRequest => this.http.get(url, {headers}) 
); 
} 

Хотя второй может показаться немного более подробным, у него есть преимущество фактически только обновить счетчик ожидающих запросов после запроса запускает, то есть когда он подписан (на первой итерации он увеличивается на вызов функции, который не совпадает с подпиской).

Кроме того, он позволяет размещать любую дополнительную логику (подумайте о времени или показателях) по всему объекту запроса, не прибегая к переменным побочного эффекта.

0

Основываясь на рекомендации @ silentsod, я теперь создаю наблюдаемый, подписываясь на него, а затем возвращаю его после.

let req = this.http.put(
    this.config.apiUrl + '' + url, JSON.stringify(this.request), 
    { headers: this.getHeaders(this.config.apiUrl + url + JSON.stringify(this.request)) } 
) 
    .catch(err => { 
    if (err.status === 401 || err.status === 403) { 
     let res: Response = err; 
     window.location.replace(this.config.membershipUrl + 
     '/#/Home?ReturnURL=' + this.config.appUrl + '/#/authorize&appID=24B89F21-54ED-4073-94AA-BDC354668667'); 
     return Observable.of(res.json()); 
    } else if (err.status === 500) { 
     this.router.navigateByUrl('/error'); 
    } 
    }); 
req.subscribe(() => { 
    if (this.pendingRequests.getValue() > 0) { 
    pending = this.pendingRequests.getValue(); 
    this.pendingRequests.next(pending - 1); 
    } 
}); 
return req; 
+0

Обратите внимание, что это вызовет вызов дважды. – paulpdaniels

+0

Так что я только что заметил ... Теперь я не уверен, что делать. Я забыл, что подписывает звонки дважды. –

+0

@paulpdaniels любая идея, как я могу достичь той же цели, не вызывая дважды? –

Смежные вопросы