【问题标题】:Getting Text From Fetch Response Object从获取响应对象中获取文本
【发布时间】:2017-06-16 05:35:39
【问题描述】:

我正在使用fetch 进行 API 调用,一切正常,但在这个特定的实例中,我遇到了一个问题,因为 API 只是返回一个字符串,而不是一个对象。

通常,API 返回一个对象,我可以解析 JSON 对象并获取我想要的内容,但在这种情况下,我无法在响应对象中找到从 API 获取的文本。

这是响应对象的样子。

我以为我会在正文中找到文本,但我似乎找不到。我在哪里看?

【问题讨论】:

  • 您可以使用typeof 来检查返回的类型,如果是对象则为其他内容,如果为字符串则为其他内容。
  • 好的,但是响应对象中的实际文本响应在哪里?在 typeof 检查之后,我仍然需要从响应中提取我期望的字符串。
  • 使用 .text() 方法读取响应流。

标签: javascript ajax fetch


【解决方案1】:

您可以尝试使用 fetch JavaScript API:

response.text().then(function (text) {
  // do something with the text response 
});

还可以查看fetch > response > body interface methods 上的文档

【讨论】:

    【解决方案2】:

    ES6 语法:

         fetch("URL")
            .then(response => response.text())
            .then((response) => {
                console.log(response)
            })
            .catch(err => console.log(err))
    

    【讨论】:

    • 为什么会有两次呢?
    • 因为 response.text() 返回承诺
    • 虽然这行得通,但我还是坚持使用 MDN 模式(第二个 then 链接到 response.text() (source)。
    【解决方案3】:

    您可以通过两种不同的方式做到这一点:

    1. 第一个选项是使用 response.text() 方法,但请注意,在 2019 年 12 月,its global usage is only 36.71%

      async function fetchTest() {
          let response = await fetch('https://httpbin.org/encoding/utf8');
          let responseText = await response.text();
      
          document.getElementById('result').innerHTML = responseText;
      }
      
      (async() => {
          await fetchTest();
      })();
      <div id="result"></div>
    2. 第二种选择是改用response.body 属性,这需要更多的工作,但有73.94% of global usage

      async function fetchTest() {
          let response = await fetch('https://httpbin.org/encoding/utf8');
          let responseText = await getTextFromStream(response.body);
          
          document.getElementById('result').innerHTML = responseText;
      }
      
      async function getTextFromStream(readableStream) {
          let reader = readableStream.getReader();
          let utf8Decoder = new TextDecoder();
          let nextChunk;
          
          let resultStr = '';
          
          while (!(nextChunk = await reader.read()).done) {
              let partialData = nextChunk.value;
              resultStr += utf8Decoder.decode(partialData);
          }
          
          return resultStr;
      }
      
      (async() => {
          await fetchTest();
      })();
      <div id="result"></div>

    【讨论】:

    • 2021 年 1 月 response.text() 的 93.14%。
    • 什么时候使用第二个选项?
    • 为什么使用百分比是相关的?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-07
    • 1970-01-01
    • 2018-12-02
    • 2014-06-15
    • 2019-08-12
    • 1970-01-01
    • 2015-02-12
    相关资源
    最近更新 更多