嵌套的 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 请求的主要内容,如果未能解决你的问题,请参考以下文章

javascript 多层嵌套try catch问题

为啥 try .. catch() 不能与 async/await 函数一起使用?

从不用 try-catch 实现的 async/await 语法说错误处理

promise,async await,try catch的问题整理

从不用 try-catch 实现的 async/await 语法说错误处理

如何在写await async的时候不用try catch