gpt4 book ai didi

javascript - AngularJS - promise 重新抛出捕获的异常

转载 作者:可可西里 更新时间:2023-11-01 01:16:25 24 4
gpt4 key购买 nike

在下面的代码中,$q promise 的catch 函数捕获了一个异常:

// Fiddle - http://jsfiddle.net/EFpn8/6/
f1().then(function(data) {
console.log("success 1: "+data)
return f2();
})
.then(function(data) {console.log("success 2: "+data)})
.catch(function(data) {console.log("error: "+data)});

function f1() {
var deferred = $q.defer();
// An exception thrown here is not caught in catch
// throw "err";
deferred.resolve("done f1");
return deferred.promise;
}

function f2() {
var deferred = $q.defer();
// An exception thrown here is handled properly
throw "err";
deferred.resolve("done f2");
return deferred.promise;
}

但是,当我查看控制台日志输出时,我看到以下内容:

enter image description here

异常在Angular中被捕获,但也被浏览器的错误处理捕获。此行为会在 Q 库中重现。

这是一个错误吗?我怎样才能真正用 $q 捕获异常?

最佳答案

Angular 的 $q 使用一个约定,抛出的错误被记录下来,不管是否被捕获。相反,如果你想发出拒绝信号,你需要 return $q.reject(... 这样:

function f2() {
var deferred = $q.defer();
// An exception thrown here is handled properly
return $q.reject(new Error("err"));//throw "err";
deferred.resolve("done f2");
return deferred.promise;
}

这是为了区分拒绝和类似 SyntaxError 的错误。就个人而言,这是我不同意的设计选择,但这是可以理解的,因为 $q 很小,所以您无法真正构建可靠的未处理拒绝检测机制。在像 Bluebird 这样更强大的库中,不需要这种东西。

作为旁注——永远、永远不要抛出字符串:那样你会错过堆栈跟踪。

关于javascript - AngularJS - promise 重新抛出捕获的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23324942/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com