1

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

我有这样的代码

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

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

到底是怎么回事?BodyAPI的目的是什么?

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

规格说明如下:

给定类型的 Request 对象的消费主体算法运行以下步骤:

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

  2. 设置干扰标志。

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

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

    1. 令 bytes 为空字节序列。

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

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

  5. 返回页码。

我不是很聪明。

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

4

2 回答 2

1

这是我的解释:

给定类型的 Request 对象的消费主体算法运行以下步骤:

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

  2. 设置干扰标志。

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

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

    1. 令 bytes 为空字节序列。

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

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

  5. 返回页码。

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

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

于 2016-02-11T20:25:45.973 回答
1

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

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

于 2016-02-11T20:46:26.123 回答