簡體   English   中英

Angular - 接收和返回 Observable<T> Http.post 中的響應

[英]Angular - receive and return Observable<T> response in Http.post

我實現了一個返回 Observable 的方法。 在此方法中,我使用 http.post 向后端發送請求。 收到響應后,這是一個 JSON 對象,我想將其存儲在一個 Observable 變量中並返回該變量。 但不知何故我沒能解決這個問題。 在 .subscribe 中, res 變量未存儲在 postResponse 變量中,但我可以在“本地” console.log 中看到 res 變量具有正確的值。 全局 console.log 是空的。 此外,我收到錯誤:

“TS2322:類型‘ArqResponse’不可分配給類型‘Observable’”返回錯誤。

我的代碼如下所示:

postARQRequest(request): Observable<ArqResponse>{
    let postResponse = new ArqResponse;
    const result = this.http.post<ArqResponse>(this.arqUrl, request)
                       .subscribe((res: ArqResponse) => { postResponse = res; console.log('shadow: ' + res)});
    console.log('global: ' + JSON.stringify(postResponse));
    return postResponse;
}

我的問題是:

  1. 如何將響應正文存儲在變量中,然后可以返回?
  2. 如何將 ArqResponse 變量“強制轉換”為 Observable 變量?
  3. .subscribe似乎是錯誤的,因為我得到:

this.arqService.postARQRequest(...).subscribe 不是函數錯誤

我猜這就是你想要的:

postARQRequest(request): Observable<ArqResponse>{
    return this.http.post<ArqResponse>(this.arqUrl, request);
}

無需在這里訂閱任何內容。 鑒於this.http.post返回您想要的類型,只需返回即可。

如果您真的想將響應存儲在局部變量中,有一些方法可以做到這一點:

改用承諾,以獲得結果。 使其可觀察使用of后面:

async postARQRequest(request): Observable<ArqResponse>{
    let postResponse = new ArqResponse;
    postResponse = await this.http.post<ArqResponse>(this.arqUrl, request).toPromise();

    return of(postResponse);
}

使用tap運算符對響應做出反應,但不對其進行變異

postARQRequest(request): Observable<ArqResponse>{
    return this.http.post<ArqResponse>(this.arqUrl, request).pipe(
        tap((res) => ...) // do stuff with res here, but it won't be mutated
    );
}

使用map運算符將響應映射到其他內容

postARQRequest(request): Observable<ArqResponse>{
    return this.http.post<ArqResponse>(this.arqUrl, request).pipe(
        map((res) => ...) // do stuff with res here, but it *will map to whatever you return from this handler*
   );
}

我想這可能對你有幫助

postARQRequest(): Observable<ArqResponse[]> {
 return this.http.post(this.arqUrl, request)
 .map(this.extractData()) <== passing result of function
 .catch(this.handleError()); <== passing result of function
}

在這里處理響應和錯誤

private extractData(res: Response) {
   let body = res.json(); 
   return body.data || { }; 
}

private handleError (error: any) {
    let errMsg = error.message || 'Server error';
    console.error(errMsg); 
    return Observable.throw(errMsg);
}

YThe方法http.post已經返回一個Observable ,這樣你就可以直接做這樣的:

postARQRequest(request): Observable<ArqResponse>{
    return this.http.post<ArqResponse>(this.arqUrl, request);
}

然后訂閱它: this.arqService.postARQRequest(...).subscribe()

如果你想一個對象轉換為可觀察到的,你可以使用ofRxjs6:

import { of } from 'rxjs';

// ...

// create an Observable from a value:
of(someObject);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM