【问题标题】:nested try, catch and async, await requests嵌套的 try、catch 和 async、await 请求
【发布时间】: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);
}
}
【问题讨论】:
标签:
javascript
async-await
try-catch
fetch-api
【解决方案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;
}
}