承诺-捕获无效

kyl*_*art 4 javascript promise angularjs

为什么下面的代码没有捕获引发的异常?

$http.get(null)        // <- this throws a fit
.catch(function (e) {
  console.log(e);      // <- this is not being triggered
});
Run Code Online (Sandbox Code Playgroud)

错误:[$ http:badreq] Http请求配置url必须是字符串或$ sce受信任对象。收到:null https://errors.angularjs.org/1.7.2/$http/badreq?p0=null

Fel*_*ura 6

您需要了解这catch是在等待您的get呼叫“拒绝”。

换句话说,你$http.get正在触发一个错误并且永远不会返回一个承诺......这样,你就不能直接从错误中执行 catch ,明白吗?

如果你拥有$http.get("xyz")它,它就会做它的事情并拒绝,因此,被你的捕获物捕获。

你正在做的事情会导致这样的结果

// step 1
$http.get(null)
    .catch()

// step 2
ERROR
    .catch() // will not even get here, but if it did, it wouldn't work either
Run Code Online (Sandbox Code Playgroud)

然而,如果你get可以工作,但被拒绝了,你会:

// step 1
$http.get('someFailingURL')
    .catch()

// step 2
RejectedPromise
    .catch() // gonna work :)
Run Code Online (Sandbox Code Playgroud)

如果您的网址来自不同的来源(这就是为什么您null有时会获得它的值),您可能应该在尝试获取它之前验证它,如下所示:

if (yourVariableURL !== null) {
    $http.get(yourVariableURL)
        .catch()
} else {
    console.log('Invalid url');
}
Run Code Online (Sandbox Code Playgroud)


Ken*_*ton 5

.catch()不能代替普通的try catch

它专门用于处理在承诺解决过程中发生的特殊情况。

在这种情况下,异常(引发拟合)发生在承诺解决流程之外。

您向$http.get方法提供的无效输入会导致XHR甚至在创建XHR之前就发生异常,这并不是 HTTP请求或任何后续处理出错的原因。

这等效于正在发生的事情:

try {
  $http.get(throwAnException()) 
    // .catch isn't even being evaluated!
    .catch(function(e) { 
      console.error(e); // no chance of being called      
    });

} catch (e) {
  // I would be evaluated
  console.error(e);
}

function throwAnException() {
  throw "An error before we even start";
}
Run Code Online (Sandbox Code Playgroud)