对异步行为感到困惑

Confused by async behavior

我正在使用 try/catch 发出一些获取请求,然后我从 HTML 中提取标题并将其添加到我的 object 'sleekResponse' 当我尝试解析 body 并将其添加到 object 时,我遇到了 return 值的问题,其中不包括我从 HTML[= 中提取的标题11=]

我知道这与异步性或我对 Promises 的浅薄理解有关,但我不知道为什么 return 值与发送前记录的值不同。

async function fetchUrl(url) {
  console.log(url);
  try {
    const myInit = {
      mode: 'cors'
    }

    let sleekResponse = {};

    await fetch(url, myInit).then(function (response) {
      sleekResponse.redirected = response.redirected;
      sleekResponse.status = response.status;
      return response;
    })
    .then((response) => titleWait(response))
    .then((res) => sleekResponse.title = res)

    function titleWait(response) {
      Promise.resolve(response.text()).then((res) => {
        a = res.split('<title>');
        b = a[1].split('</title>')
        sleekResponse.title = b[0];
        return sleekResponse;
      })
      console.log(sleekResponse);
      return sleekResponse;
    }

    console.log(sleekResponse); // This logs the correct value
    return sleekResponse; // when it's returned it doesn't show the title that was added
  } catch (err) {
    return `${err}`;
  }
}

我尝试了很多东西,但我不记得我尝试过的所有东西。我知道我遗漏了一些可能很明显的东西,但我仍然不明白为什么 console.log 值与 return 一行后的值不同。

希望能帮到你

这个基本的 fetch();

const response = await fetch('your url') 

const data = await response.json();

console.log(data);

主要问题是 titleWait 没有 return 自己的承诺:

    function titleWait(response) {
      return Promise.resolve(response.text()).then((res) => {
        a = res.split('<title>');
        b = a[1].split('</title>')
        sleekResponse.title = b[0];
        return sleekResponse;
      });
    }

写起来还是很绕。这个比较好:

    async function titleWait(response) {
      const res = await response.text());
      const a = res.split('<title>');
      const b = a[1].split('</title>')
      sleekResponse.title = b[0];
      return sleekResponse;
    }