我有一个抛出Error
$.when(verifyInitArgs(initArgs))
.then(function argsAreValid() {
initialiseForm();
}, function argsInvalid(error) {
throw new Error(error);
});
error
变量是string
。设置断点时,我可以使用typeof
看到这一点:
>> typeof error
"string"
但是,在IE或Firefox的控制台窗口中没有显示抛出的错误。
如果我直接在浏览器控制台中输入throw new Error("something");
,那么它会按预期工作,它会在控制台中显示为错误。
这里发生了什么?
答案 0 :(得分:1)
回想一下,then
(以及catch
等)会创建新承诺,即回调中的代码会影响其结果。在Promises / A +的承诺风格中(JavaScript的本机承诺遵循那些语义,并且jQuery一直试图将Deferreds排成一行 - 而你现在使用的v3.1.1现在已经在线了,我相信),当你投入一个承诺时then
或catch
回调,该异常转换为对then
或catch
方法创建的承诺的拒绝。
因此,您的throw new Error(...)
正在拒绝致电then
的回复。
浏览器正在更新对未处理的拒绝的处理,以便那些出现在控制台中(目前对此的支持各不相同);可能值得切换到原生承诺。
仅举例说明,这是一个在then
回调中抛出本机承诺的示例:
new Promise(function(resolve) {
console.log("First promise resolving");
resolve("all good");
}).then(function(resolution) {
console.log("Got resolution " + resolution);
console.log("Throwing error from second promise");
throw new Error("ack!");
});
在最近的Chrome浏览器中,当你运行它时,如果你打开真正的控制台(而不仅仅是in-snippet),你会看到
Uncaught (in promise) Error: ack!(…)
...报告未处理的拒绝。
相比之下,使用jQuery v3.1.1,我没有看到错误:
var d = $.Deferred();
d.promise().then(function(resolution) {
console.log("Got resolution " + resolution);
console.log("Throwing error from second promise");
throw new Error("ack!");
});
console.log("First promise resolving");
d.resolve("all good");
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
...这就是为什么切换到原生承诺可能很有用(如果你的项目可行)。