嵌套的 try、catch 和 async、await 请求
Posted
技术标签:
【中文标题】嵌套的 try、catch 和 async、await 请求【英文标题】:nested try, catch and async, await requests 【发布时间】:2018-07-05 01:19:28 【问题描述】:我正在尝试使用 fetch() 发出三个请求,每个请求取决于前一个请求的结果。如果任何请求失败,我想抛出一个自定义错误。
此模式有效,除非最里面的请求失败,它会抛出所有三个错误。如果中间请求失败,则抛出中间和外部错误。
如何解决此问题,使其仅从请求失败的级别引发错误?有没有更好的写法?
async function requests()
try
let response1 = await fetch();
if (response1.ok)
try
let response2 = await fetch();
if (response2.ok)
try
let response3 = await fetch();
if (response3.ok)
let jsonResponse3 = response3.json();
return jsonResponse3;
throw new Error('Request 3 failed');
catch (error)
console.log(error);
throw new Error('Request 2 failed');
catch (error)
console.log(error);
throw new Error('Request 1 failed');
catch (error)
console.log(error);
【问题讨论】:
如果你想抛出错误而不继续,不要捕获错误。 【参考方案1】:试试这样的。
function dummyFetch()
return new Promise(resolve =>
setTimeout(() =>
resolve(
ok: true
)
, 500)
)
async function doAllSteps()
const response1 = await dummyFetch()
if (!response1.ok)
throw new Error('foo')
const response2 = await dummyFetch()
if (!response2.ok)
throw new Error('foo')
const response3 = await dummyFetch()
if (!response3.ok)
throw new Error('foo')
const response4 = await dummyFetch()
if (!response4.ok)
throw new Error('foo')
return 'you did it!'
function go()
return new Promise((resolve, reject) =>
try
resolve(doAllSteps())
catch (error)
reject(error)
)
go().then((success) =>
console.log(success)
)
【讨论】:
【参考方案2】:你可以一个接一个地做而不是嵌套吗?
async function requests()
try
let response1 = await fetch();
throw new Error('Request 1 failed');
catch (error)
console.log(error);
if (response1 && response1.ok)
try
let response2 = await fetch();
throw new Error('Request 2 failed');
catch (error)
console.log(error);
if (response2 && response2.ok)
try
let response3 = await fetch();
throw new Error('Request 3 failed');
catch (error)
console.log(error);
if (response3 && response3.ok)
let jsonResponse3 = response3.json();
return jsonResponse3;
【讨论】:
以上是关于嵌套的 try、catch 和 async、await 请求的主要内容,如果未能解决你的问题,请参考以下文章
为啥 try .. catch() 不能与 async/await 函数一起使用?
从不用 try-catch 实现的 async/await 语法说错误处理
promise,async await,try catch的问题整理