如何创建新的获取响应承诺?

How to create a new fetch Response promise?

我有一个类似于下面代码的函数 - 它生成一个 fetch,在调用成功与否时执行操作,并且 return 承诺将在下游处理:

const myFunc = (): Response => {
  return fetch('http://something')
    .then(r => {
      console.log('the call went through, the return code does not matter')
      return r
    })
    .catch(err => {
        console.error(`ah crap, the call failed completely: ${err}`)
        // and here I do not know how to return a new Response
      }
    }
}

myFunc().then(r => {
  console.log('do something once myFunc is over')
})

我的意图是在 myFunc 完成后 运行 一些代码,但我需要考虑调用完全失败的情况(无 DNS 解析、拒绝调用等)。为此,我需要在 catch() 中创建 return 一个 Response 承诺,例如,一个强制的 503 return 代码(这是不正确的因为服务器甚至没有回答,但无论如何)。

我的问题:如何创建这样的 Response 承诺?

我鼓励您不要将网络故障转变为明显的 HTTP 故障 (503),但由于您已经特别问如何做到这一点,你可以通过构建自己的 Response object:

const myFunc = (): Response => {
    return fetch("http://something")
    .catch(err => {
        console.error(`the call failed completely: ${err}`)
        return new Response(null, {
            status: 503,
            statusText: "Fake 503",
        }); 
    });
};

或者如果您想使用 async 函数:

const myFunc = async (): Response => {
    try {
        return await fetch("http://something");
    } catch (err) {
        console.error(`the call failed completely: ${err}`)
        return new Response(null, {
            status: 503,
            statusText: "Fake 503",
        }); 
    }
};

(请注意,第一个中不需要您的 .then(除非您想执行 console.log)。)

但是,我强烈建议您不要这样做。相反,通过 .finally 处理程序(或 async 函数中的 try/finally 块在调用时处理此问题。