Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/447.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
Javascript angular是否真的遵循fetch';什么样的规格?_Javascript_Angular_Http_Fetch - Fatal编程技术网

Javascript angular是否真的遵循fetch';什么样的规格?

Javascript angular是否真的遵循fetch';什么样的规格?,javascript,angular,http,fetch,Javascript,Angular,Http,Fetch,Angular的http文档表示http服务返回的响应遵循fetch规范 在他们的示例中,这是您可以找到的代码 private extractData(res: Response) { let body = res.json(); return body.data || { }; } 其中,res.json()的结果显然不是承诺 但是在fetch规范中,response.json()方法应该返回一个Promise 我是否在fetch规范中遗漏了什么,或者Angular的实现有误?查

Angular的
http
文档表示
http
服务返回的响应遵循
fetch
规范

在他们的示例中,这是您可以找到的代码

private extractData(res: Response) {
  let body = res.json();
  return body.data || { };
}
其中,
res.json()
的结果显然不是承诺

但是在
fetch
规范中,
response.json()
方法应该返回一个
Promise


我是否在
fetch
规范中遗漏了什么,或者Angular的实现有误?

查看Angular的http源代码,很明显它没有返回承诺:

 json(): any {
    if (typeof this._body === 'string') {
      return JSON.parse(<string>this._body);
    }

    if (this._body instanceof ArrayBuffer) {
      return JSON.parse(this.text());
    }

    return this._body;
  }

  // source https://github.com/angular/angular/blob/master/packages/http/src/body.ts#L26
json():任意{
if(此的类型。_body==='string'){
返回JSON.parse(此._体);
}
if(此._主体实例为ArrayBuffer){
返回JSON.parse(this.text());
}
把这个还给我;
}
//来源https://github.com/angular/angular/blob/master/packages/http/src/body.ts#L26
但是说明书上说

[NoInterfaceObject, Exposed=(Window,Worker)]
interface Body {
  readonly attribute ReadableStream? body;
  readonly attribute boolean bodyUsed;
  [NewObject] Promise<ArrayBuffer> arrayBuffer();
  [NewObject] Promise<Blob> blob();
  [NewObject] Promise<FormData> formData();
  [NewObject] Promise<any> json();
  [NewObject] Promise<USVString> text();
};
[NoInterfaceObject,Exposed=(窗口,工作者)]
界面体{
只读属性ReadableStream?正文;
使用只读属性;
[NewObject]Promise arrayBuffer();
[NewObject]Promise blob();
[NewObject]Promise formData();
[NewObject]Promise json();
[NewObject]承诺文本();
};
因此,angular似乎决定不严格遵循规范。

我认为你是对的(因为),他们没有遵循
获取
的规范,内部使用
JSON.parse
解析JSON(请参阅:)


我认为他们这样做是为了更容易地将错误传播到调用堆栈中,因此用户可以通过
http.get().catch()
轻松捕获错误。但要了解更多信息,请尝试通过直接询问他们。

事实上,这一行规范令人困惑。在MDN中,这显然是一个承诺,在规范中,
json
的签名是
[NewObject]promiseTome,很明显,它必须返回一个承诺。promise是一个对象,每个
json()
调用都应该返回一个新的promise obj,而不是相同的引用(如规范所述)。完全同意。也许有一个理由让angular团队选择不兑现承诺。我可以调查那件事:)