Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否可以为angular 2 http创建稍微不同版本的subscribe()方法?_Angular_Typescript_Rxjs_Angular2 Services - Fatal编程技术网

是否可以为angular 2 http创建稍微不同版本的subscribe()方法?

是否可以为angular 2 http创建稍微不同版本的subscribe()方法?,angular,typescript,rxjs,angular2-services,Angular,Typescript,Rxjs,Angular2 Services,我在试安格拉尔。我发现我们应该使用subscribe方法来检索get或post方法的结果: 但是我想创建一个自定义版本的subscribe方法,它有一个错误回调函数,它的错误参数不是任何,并且是强类型的。因此,我们将能够通过以下方式订阅可观测数据: this.http.post(path, item).subscribe( (response: Response)=> {console.log(response)}, (error: HttpError)=>{console.

我在试安格拉尔。我发现我们应该使用subscribe方法来检索get或post方法的结果:

但是我想创建一个自定义版本的subscribe方法,它有一个错误回调函数,它的错误参数不是任何,并且是强类型的。因此,我们将能够通过以下方式订阅可观测数据:

this.http.post(path, item).subscribe(
  (response: Response)=> {console.log(response)},
  (error: HttpError)=>{console.log(error.body)}
);
我声明HttpError如下:

import { ModelState } from "app/Base/model-state";
import { ModelStateDictionary } from "app/Base/model-state-dictionary";
import { ErrorBody } from "app/Base/error-body";

export class HttpError {
    public ok: boolean;
    public status: number;
    public statusText: string;
    public type: number;
    public url: string;
    public body: ErrorBody;
    public static create(error: any): HttpError {
        let errorBody: ErrorBody = new ErrorBody();
        let body = JSON.parse(error._body)
        errorBody.message = body.message == null ? "" : body.message;
        errorBody.modelStateDictionary = new ModelStateDictionary();
        if (body.modelState != null) {
            for (let key in body.modelState) {
                let modelState: ModelState = new ModelState();
                modelState.Value = key;
                for (let value in body.modelState[key]) {
                    modelState.Error.push(value);
                }
                errorBody.modelStateDictionary.push(modelState);
            }
        }
        let httpError: HttpError = new HttpError();
        httpError.body = errorBody;
        httpError.ok = error.ok;
        httpError.status = error.status;
        httpError.statusText = error.statusText;
        httpError.type = error.type;
        httpError.url = error.url;
        return httpError;
    }
}

但我需要在订阅之前调用create方法,并将java对象错误转换为HttpError。我想我需要创建一个自定义的可观测或可使用地图。我不熟悉打字脚本和反应式编程。能否请您解释一下如何进行此转换,从而用户可以使用更好的subscribe版本?

首先,我相信Angular中的http.post只是封装了http响应。下面是源代码

function httpRequest(backend: ConnectionBackend, request: Request): Observable<Response> {
  return backend.createConnection(request).response;
}
我认为你可以扩展一种方法,你想在Observable中处理响应,并得到你定义的对象。类似这样的内容。http.postpath,item.castHttpError.subscribe

但是,我不确定这是否安全,因为您正在扩展一个可靠的库。至少,Angular不建议开发人员创建他/她自己的Angular发行版。你可以试一试

最后,我建议您编写一个实用方法来实现这一点,这可能是多余的,但不会造成伤害

this.http.post(path, item).subscribe(
  response => { console.log(response); },
  error => {
    console.log(toHttpError(error).body);
  }
);

这里的错误块不是用于您认为的目的。您正在查找response.status,因为像4xx和5xx状态代码这样的东西在这个上下文中实际上并不例外。请参阅Angular文档中的更多详细信息。您在这里的一般困惑是试图将此委托给.subscribe,这是一种与请求无关的方法。服务方法只返回响应类的可观察值,如上所述。把可观察的东西想象成一种传输媒介,因为它所承载的反应才是重要的。这里的错误中有一个异常,类似于套接字连接失败或超时。
this.http.post(path, item).subscribe(
  (response: Response)=> {console.log(response)},
  (error: any)=>{console.log(error)}
);
this.http.post(path, item).subscribe(
  response => { console.log(response); },
  error => {
    console.log(toHttpError(error).body);
  }
);