【问题标题】:Confusion with how fetch api works对 fetch api 的工作方式感到困惑
【发布时间】:2019-07-14 01:00:46
【问题描述】:

我正在学习 fetch api,对这段代码有点困惑:

fetch('/article/promise-chaining/user.json')
  // .then below runs when the remote server responds
  .then(function(response) {
    // response.text() returns a new promise that resolves with the full response text
    // when we finish downloading it
    return response.text();
  })
  .then(function(text) {
    // ...and here's the content of the remote file
    alert(text); // {"name": "iliakan", isAdmin: true}
  });

所以,从上面的代码可以看出,我们向某个位置发送 Get 请求。然后 fetch 返回带有响应对象的承诺,响应对象仅包含标题作为响应没有文件本身。那是对的吗?然后为了将文件本身作为文本获取,我们向服务器发出附加请求。那是对的吗?或者,如果我们想使用 response.json(),那么服务器会将解析后的 JSON 发送给我们

【问题讨论】:

    标签: javascript


    【解决方案1】:

    链接承诺和发出 HTTP 请求是不同的事情。在 fetch 的情况下,您确实将一个 Promise 链接到另一个 Promise,但这样做不会导致对服务器的另一个 HTTP 请求。相反,第一个 Promise 在收到 headers 后执行,第二个 Promise 在收到同一请求的正文后执行。

    【讨论】:

    • 嘿约瑟夫,谢谢您的热情回复。好的,也许是一个奇怪的问题,为什么不能将其作为一个请求,也就是说,在不链接它们的情况下同时获取标头和正文。请您说明首先获取响应标头然后获取正文本身的原因,而不是立即将它们都作为 then() 获取。
    • 你可以,alert(response.text()) 没有链接。我相信这个例子是为了表明如果你愿意,你可以继续这个链条。例如,您可能希望从具有承诺的用户那里获取登录数据,然后登录。然后将页面更新为链。而不是跨三个函数使用回调,这在查看代码时不会立即表明它们的关系。
    • @wayne...你不能alert(response.text() ...所有内容方法都返回承诺
    • @charlietfl 我的错。我不同意让内容方法返回承诺的设计考虑,因为没有必要。但你可以提醒(等待 response.text())。
    • @MMMMMM 因为在处理正文之前应该检查元数据,因为 fetch() 不会将非 200 响应视为拒绝。所以 404 仍然会在初始承诺中解决,并且正确使用 api 应该在解析正文之前检查响应元数据
    猜你喜欢
    • 2012-08-24
    • 2019-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-10
    • 1970-01-01
    • 2019-08-31
    • 2012-04-28
    相关资源
    最近更新 更多