开发者问题收集

Request.text()(以及从 Body 实现的其他函数)实际上起什么作用?

2016-02-11
305

根据 其 MDN 描述 Request 已实现 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 页面,所以现在有意义了。)

规范 规定如下:

A Request object's consume body algorithm, given a type, runs these steps:

  1. If this Request object is disturbed, return a new promise rejected with a TypeError.

  2. Set disturbed flag.

  3. Let p be a new promise.

  4. Run these substeps in parallel:

    1. Let bytes be the empty byte sequence.

    2. If request's body is not null, set bytes to the result of reading from request's body until it returns end-of-stream.

    3. Resolve p with the result of running the package data algorithm with bytes, type and MIME type. If that threw an exception, reject p with that exception.

  5. Return p.

我对此不是很了解。

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

2个回答

这是我的解释:

A Request object's consume body algorithm, given a type, runs these steps:

  1. If this Request object is disturbed, return a new promise rejected with a TypeError.

  2. Set disturbed flag.

  3. Let p be a new promise.

  4. Run these substeps in parallel:

    1. Let bytes be the empty byte sequence.

    2. If request's body is not null, set bytes to the result of reading from request's body until it returns end-of-stream.

    3. Resolve p with the result of running the package data algorithm with bytes, type and MIME type. If that threw an exception, reject p with that exception.

  5. Return p.

遵循 1、2、3、4.1,4.2 为假,4.3 将带您进入包数据算法( https://fetch.spec.whatwg.org/#concept-body-package-data ),对于 text ,该算法返回对 bytes 运行 utf-8 解码的结果。

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

Marco Castelluccio
2016-02-11

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

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

Karel Bílek
2016-02-11