Mithril承诺链中的ReferenceError正在被忽略

时间:2014-09-24 02:15:41

标签: javascript strict mithril.js

我正在使用带有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中的错误。

2 个答案:

答案 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

捕获