2017-02-16 1 views
0

Я пытаюсь расширить класс Http для своего приложения Ionic2-Angular2. Основная проблема связана с получением элемента из (локального | сеанса) Хранения, которое в Ionics2 возвращает Promise, и мне пришлось преобразовать его в Observable (или, по крайней мере, я думаю, это из-за этого), чтобы сделать расширение постоянным с типом возвращаемого значения для каждой функции класса, который я расширяю.Как расширить класс Http Angular2 для его настройки (в проекте Ionic2)

getCustomRequest(url:string, method:string, options?: RequestOptionsArgs, body?:any):Observable<any>{ 
    let headers = new Headers({'Content-Type': 'application/json'}); 

    return Observable.fromPromise(
     this.storage.get("authToken").then(
     data => { 
      console.log('Token '+data); 
      headers.append("Authorization", 'Token '+data); 
      return this.getNewReq({method, headers, body, url}, options); 
     }, 
     error => { 
      console.log('no token!'); 
      return this.getNewReq({method, headers, body, url}, options); 
     } 
    ) 
    ); 
    } 


    private getNewReq(reqOptObject, options):Request{ 
    let reqOpt = new RequestOptions(reqOptObject); 
    if (options) { 
     reqOpt = reqOpt.merge(options); 
    } 
    return new Request(reqOpt); 
    } 

    request(url: string|Request, options?: RequestOptionsArgs): Observable<Response> { 
    return super.request(url, options); 
    } 


    post(url: string, body: any, options?: RequestOptionsArgs): Observable<Response>{ 
    return this.getCustomRequest(url, 'POST', options, body) 
       .map(newReq => { console.log(newReq); return this.request(newReq); }); 
    } 

сообщение об ошибке [возвратная линии this.getCustomRequest (URL ...]: Тип «Наблюдаемое>» не присваиваемый типа «Наблюдаемого» Типа «Наблюдаемый» не может быть назначен для типа «Response. ». Свойство„типа“отсутствует в типе „наблюдаемых“.

ответ

0

Поскольку this.request() возвращает Observable Я думаю, вам нужно использовать merge вместо map

post(url: string, body: any, options?: RequestOptionsArgs): Observable<Response>{ 
    return this.getCustomRequest(url, 'POST', options, body) 
       .merge(newReq => { console.log(newReq); return this.request(newReq); }); 
    } 
+1

Почему только слияние я думаю, что Concat также будет работать правильно @Gunter –

+0

Я не хотел сказать, что это единственный возможный способ, просто «карта» не будет работать здесь, и это «слияние» будет. 'concat' тоже кажется прекрасным. –

+0

Теперь он дает мне эту ошибку, когда загружена страница и ни один запрос не выполнен. 'EXCEPTION: Uncaught (in prom): [object PositionError]' – Elisa

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