【问题标题】: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;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2019-03-14
      • 2018-10-02
      • 1970-01-01
      • 2018-06-21
      • 2018-05-29
      • 2017-11-23
      相关资源
      最近更新 更多