Request.text()(以及从 Body 实现的其他函数)实际上做了什么?
What does Request.text() (and other functions implemented from Body) actually do?
基于 its MDN description,Request
实现了 Body
的功能,例如 text()
。但是,我不知道这些功能实际上做了什么。他们似乎什么都不做。
我有这样的代码
var r = new Request('http://google.com');
r.text().then(function(text) {
alert(JSON.stringify(text));
}, function(error) {
alert("error");
});
发生的事情是承诺立即解析,带有一个空字符串,并且没有请求发生 - 如果您在开发工具(或 wireshark)中查看网络 activity,则没有实际请求发生。但是也没有报错。
这是怎么回事? Body
API 的目的是什么?
MDN 上的描述谈到 "Response stream" 但没有响应(因为还没有实际提取)。(编辑:因为我回答了我自己的问题,我还编辑了 MDN 页面,所以它现在有意义了。)
The specs 说明如下:
A Request object's consume body algorithm, given a type, runs these
steps:
If this Request object is disturbed, return a new promise rejected
with a TypeError.
Set disturbed flag.
Let p be a new promise.
Run these substeps in parallel:
Let bytes be the empty byte sequence.
If request's body is not null, set bytes to the result of reading from
request's body until it returns end-of-stream.
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.
Return p.
我不是很聪明。
(注意:我知道我问的是一个非常详细的问题。我不是在问 fetch
/Response
/Request
的一般作用。)
这是我的解读:
A Request object's consume body algorithm, given a type, runs these
steps:
If this Request object is disturbed, return a new promise rejected
with a TypeError.
Set disturbed flag.
Let p be a new promise.
Run these substeps in parallel:
Let bytes be the empty byte sequence.
If request's body is not null, set bytes to the result of reading from
request's body until it returns end-of-stream.
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.
Return p.
按照1、2、3、4.1、4.2是假的,4.3带你打包数据算法(https://fetch.spec.whatwg.org/#concept-body-package-data),其中,对于text
、returns的结果运行 utf-8 解码 bytes
.
bytes
是一个空字节序列,所以promise解析为空字符串。
实际上可以向请求添加一些正文,.text()
等将 return 请求的 正文。
一个简单的例子:
// 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");
});
基本上就是这样。问题中的示例没有正文,因此解析为空字符串。
基于 its MDN description,Request
实现了 Body
的功能,例如 text()
。但是,我不知道这些功能实际上做了什么。他们似乎什么都不做。
我有这样的代码
var r = new Request('http://google.com');
r.text().then(function(text) {
alert(JSON.stringify(text));
}, function(error) {
alert("error");
});
发生的事情是承诺立即解析,带有一个空字符串,并且没有请求发生 - 如果您在开发工具(或 wireshark)中查看网络 activity,则没有实际请求发生。但是也没有报错。
这是怎么回事? Body
API 的目的是什么?
MDN 上的描述谈到 "Response stream" 但没有响应(因为还没有实际提取)。(编辑:因为我回答了我自己的问题,我还编辑了 MDN 页面,所以它现在有意义了。)
The specs 说明如下:
A Request object's consume body algorithm, given a type, runs these steps:
If this Request object is disturbed, return a new promise rejected with a TypeError.
Set disturbed flag.
Let p be a new promise.
Run these substeps in parallel:
Let bytes be the empty byte sequence.
If request's body is not null, set bytes to the result of reading from request's body until it returns end-of-stream.
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.
Return p.
我不是很聪明。
(注意:我知道我问的是一个非常详细的问题。我不是在问 fetch
/Response
/Request
的一般作用。)
这是我的解读:
A Request object's consume body algorithm, given a type, runs these steps:
If this Request object is disturbed, return a new promise rejected with a TypeError.
Set disturbed flag.
Let p be a new promise.
Run these substeps in parallel:
Let bytes be the empty byte sequence.
If request's body is not null, set bytes to the result of reading from request's body until it returns end-of-stream.
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.
Return p.
按照1、2、3、4.1、4.2是假的,4.3带你打包数据算法(https://fetch.spec.whatwg.org/#concept-body-package-data),其中,对于text
、returns的结果运行 utf-8 解码 bytes
.
bytes
是一个空字节序列,所以promise解析为空字符串。
实际上可以向请求添加一些正文,.text()
等将 return 请求的 正文。
一个简单的例子:
// 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");
});
基本上就是这样。问题中的示例没有正文,因此解析为空字符串。