Request.text()(以及从 Body 实现的其他函数)实际上做了什么

What does Request.text() (and other functions implemented from Body) actually do?

本文关键字:函数 其他 实际上 什么 Body text Request 实现      更新时间:2023-09-26

根据它的MDN描述,Request已经实现了Body的功能,比如text()。但是,我不知道这些功能实际上做了什么。他们似乎什么也没做。

我有这样的代码

var r = new Request('http://google.com');
r.text().then(function(text) {
    alert(JSON.stringify(text));
}, function(error) {
    alert("error");
});

发生

的情况是承诺立即解析,使用空字符串,并且没有发生任何请求 - 如果您查看开发工具(或 wireshark(中的网络活动,则不会发生实际请求。但也没有错误。

这是怎么回事?Body API 的目的是什么?

MDN 上的描述谈到了"响应流",但没有响应(因为还没有实际的获取(。 (编辑:由于我回答了自己的问题,所以我也编辑了MDN页面,所以现在有意义。

规范声明如下:

请求对象的消耗体算法(给定类型(运行这些 步骤:

  1. 如果此请求对象受到干扰,则返回拒绝的新承诺 带有类型错误。

  2. 设置干扰标志。

  3. 让p成为一个新的承诺。

  4. 并行运行以下子步骤:

    1. 让字节为空字节序列。

    2. 如果请求的正文不为 null,则将字节设置为从中读取的结果 请求的正文,直到它返回流结束。

    3. 使用运行包数据算法的结果解析 p 字节、类型和 MIME 类型。如果引发异常,则拒绝 p 那个例外。

  5. 返回 p.

我不是很聪明。

(注意:我知道我问的是一个非常详细的问题。我不是在问fetch/Response/Request一般是做什么的。

这是我

的解释:

请求对象的消耗体算法(给定类型(运行这些 步骤:

  1. 如果此请求对象受到干扰,则返回拒绝的新承诺 带有类型错误。

  2. 设置干扰标志。

  3. 让p成为一个新的承诺。

  4. 并行运行以下子步骤:

    1. 让字节为空字节序列。

    2. 如果请求的正文不为 null,则将字节设置为从中读取的结果 请求的正文,直到它返回流结束。

    3. 使用运行包数据算法的结果解析 p 字节、类型和 MIME 类型。如果引发异常,则拒绝 p 那个例外。

  5. 返回 p.

遵循 1、

2、3、4.1、4.2 为 false,4.3 将您带到包数据算法 (https://fetch.spec.whatwg.org/#concept-body-package-data(,对于text,返回在bytes上运行 utf-8 解码的结果。

bytes是一个空字节序列,因此承诺解析为空字符串。

实际上

可以在请求中添加一些正文,.text()等将返回请求的正文

一个简单的例子:

// method cannot be GET for custom body
var r = new Request('http://google.com', {method: 'POST', body: "something"}); 
r.text().then(function(text) {
    alert(JSON.stringify(text)); // alerts "something"
}, function(error) {
    alert("error");
});

基本上就是这样。问题中的示例没有正文,因此它使用空字符串解析。