【发布时间】: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