首页 > 解决方案 > 为什么 catch() 不能处理 ajax 请求?

问题描述

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()将捕获错误。如果我注释掉,或者只是删除 inside catch(),我希望外部catch()会得到错误,但事实并非如此。为什么?

标签: javascriptpromisetry-catch

解决方案


tl;博士

关于您的问题,我认为它只是不会引发异常,这就是.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()

推荐阅读