【问题标题】:What does Request.text() (and other functions implemented from Body) actually do?Request.text() (以及从 Body 实现的其他函数)实际上做了什么?
【发布时间】:2016-02-12 06:42:11
【问题描述】:

基于its MDN descriptionRequest实现了Body的功能,如text()。但是,我不知道这些功能实际上是做什么的。他们似乎什么也没做。

我有这样的代码

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

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

发生了什么事? Body API 的用途是什么?

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

The specs 声明如下:

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

  1. 如果此 Request 对象受到干扰,则返回一个新的 Promise 被拒绝 带有 TypeError。

  2. 设置干扰标志。

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

  4. 并行运行这些子步骤:

    1. 令 bytes 为空字节序列。

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

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

  5. 返回页码

我不是很聪明。

(注意:我知道我要问的是一个非常详细的问题。我不是在问fetch/Response/Request 的一般用途。)

【问题讨论】:

    标签: javascript fetch-api


    【解决方案1】:

    这是我的解释:

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

    1. 如果此 Request 对象受到干扰,则返回一个新的 Promise 被拒绝 带有 TypeError。

    2. 设置干扰标志。

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

    4. 并行运行这些子步骤:

      1. 令 bytes 为空字节序列。

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

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

    5. 返回页码

    Follow 1, 2, 3, 4.1, 4.2 为假,4.3 带你到包数据算法(https://fetch.spec.whatwg.org/#concept-body-package-data),对于text,返回在bytes上运行utf-8 decode的结果.

    bytes 是一个空字节序列,所以 promise 被解析为空字符串。

    【讨论】:

    • 嗯。它到底是为了什么?哦,我明白了,您实际上可以出于某种原因在构造函数中自己设置主体。这很奇怪,而且似乎毫无用处。
    • 哦,我很愚蠢,它实际上是请求的正文!因此,如果您添加图片等,它将读取请求正文!好的,我现在明白了。
    • 我在下面添加了我自己的答案(现在不能接受,2 天后)。
    • 我不知道你为什么不接受我的回答而接受了你的回答。
    • 抱歉回复晚了。我的问题是我只是误解了所有文档中的“正文”所指的内容,我通过我的代码示例更好地说明了这一点。
    【解决方案2】:

    实际上可以在请求中添加一些正文,.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");
    });

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-02
      • 2020-11-21
      • 2015-02-26
      • 2017-06-29
      • 2013-06-13
      • 2021-10-25
      相关资源
      最近更新 更多