我正在使用带有Mithril.js
的Firefox 32和Chrome 37,并且现在已经被变量名中的拼写错误一再绊倒,只是默默地导致JS在引用点停止执行。我来自C和Java特别令人沮丧,因为我习惯于编译器在尝试运行代码之前捕获这些微不足道的错误。
我已经缩小了仅在作为AJAX保证链的一部分运行的函数中发生的问题,如下所示:
function getListData(ctl) {
ctl.data([]);
ctl.loading(true);
return m.request({ method: "GET", url: apiBase, background: true }).then(done,fail);
function done(rspdta) {
xctl.loading(false);
ctl.data(rspdta.Customer);
m.redraw();
};
function fail(rspdta) {
ctl.loading(false);
ajaxError(ctl);
m.redraw();
throw rspdta; // continue error condition
};
}
注意xctl.loading(false)
函数中的故意done
- 脚本似乎停在那里,但抛出ReferenceError
。但是,没有记录任何内容。
我正在研究如何证明已经证明它现在被Mithril.js
捕获并被忽略,在此代码中:
function thennable (ref, cb, ec, cn) {
if ((typeof val == 'object' || typeof val == 'function') && typeof ref == 'function') {
try {
// cnt protects against abuse calls from spec checker
var cnt = 0
ref.call(val, function (v) {
if (cnt++) return
val = v
cb()
}, function (v) {
if (cnt++) return
val = v
ec()
})
} catch (e) {
/**/console.log("[**] Caught in thennable: %o",e);
val = e
ec()
}
} else {
cn()
}
};
希望来自该社区的某个人能够说出我做错了什么,误用了承诺链(??)或者它是否是Mithril.js
0.1.21中的错误。
答案 0 :(得分:2)
长话短说,这是Promises / A +规范中的一个问题(基本上它没有区分已检查和未检查的错误)。对于Mithril 0.1.21(对于本地ES6 Promises而言),捕获错误的解决方法是做Zolmeister所说的。
.then(buggyCallback) //this throws the ReferenceException
.then(null, function(e) {console.error(e)})
或者,Mithril 0.1.19(Promiz PR合并之前的最后一个版本)默认抛出控制台。
秘密0.1.22将附带一个承诺异常监视器,它允许您配置如何提前捕获承诺异常(并且将默认为程序员错误抛出到控制台)。您可以在开发回购中找到此版本。答案 1 :(得分:1)
在onFulfilled
处理程序中抛出的错误会导致拒绝的承诺。
规格:http://promisesaplus.com/#point-42
以下是解决方案:
abc.then(thrower, fail1).then(null, fail2)
它将被fail2
捕获