【问题标题】:Why is catch() not working with ajax requests?为什么 catch() 不能处理 ajax 请求?
【发布时间】:2021-06-23 12:07:33
【问题描述】:

const errorTest = () => {

  const result = $.get("http://data.fixer.io/api/latest?access_key=9790286e305d82fbde77cc1948cf847c&format=1");

  result
    .then(val => console.log(val.rates))
    .catch(err => console.error(err))


}

errorTest()
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

.then() 有效,但 catch() 无效。一直报错:result.then(...).catch is not a function at errorTest.

为什么? $.get() 应该返回一个承诺,并将其分配给result。这就是为什么.then() 有效,但为什么catch() 无效?

如果我改用fetch(),它会起作用。

 const result = fetch("http://data.fixer.io/api/latest?access_key=9790286e305d82fbde77cc1948cf847c&format=1");

那么,为什么 catch() 不能处理 ajax 请求呢?

其他问题

const errorTest = (a, b) => { 

  const result = $.get("http://dataa.fixer.io/api/latest?access_key=9790286e305d82fbde77cc1948cf847c&format=1");

  result
  .then(val => console.log(val.rates))
  //.catch(err => console.error("INSIDE ERROR" + err))

}


try { 
 errorTest()
}
catch(err) { 
  console.log("OUTSIDE ERROR!" + err)
}

链接故意不正确以获取错误。如果我取消注释函数内的 catch(),则 catch() 内的 catch() 将捕获错误。如果我注释掉,或者只是删除内部catch(),我希望外部catch() 得到错误,但事实并非如此。为什么?

【问题讨论】:

  • 它工作正常。我用 jquery 3.6.0 版测试过
  • OP 添加了一个指向 jQuery 3.3.1 的链接,但它也可以正常工作。经过测试。
  • 我添加了 jquery
  • 与其只看val.rates,不如看看完整的回报——>{ "success": false, "error": { "code": 105, "type": "https_access_restricted", "info": "Access Restricted - Your current Subscription Plan does not support HTTPS Encryption." } }
  • result 在你的第一个 sn-p 不是一个承诺,它是一个 jqXHR 对象。从 jQuery 1.5 开始,它具有您可以从 Promise API 中获得的标准方法,例如 catch,因此请检查您的 jQuery 版本

标签: javascript promise try-catch


【解决方案1】:

tl;dr

关于您的问题,我认为它不会引发异常,这就是 .then() 起作用的原因。

但是,我建议不要使用基于回调的 Promise 语法,而是使用async/await。这是一种更清洁的方式。

const errorTest = async () => { 

  try {
    const result = await $.get("http://data.fixer.io/api/latest?access_key=ACCESS_TOKEN&format=1");
    console.log(result.rates);
  } catch(e) {
    console.err(e);
  }

 
}

errorTest()

【讨论】:

  • 问题出在 jQuery 版本上。显然我没有使用最新版本。我刚刚用最新的 3.6 版本试了一下,现在可以用了。
  • 有点无关的问题但是,为什么我在函数块内部使用then(),然后在函数外部使用try .. catch,为什么外部catch()没有抛出错误,但是相反,如果块内没有catch(),它就根本不显示?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-29
  • 1970-01-01
  • 1970-01-01
  • 2011-02-17
  • 2011-04-22
  • 1970-01-01
相关资源
最近更新 更多