我正在使用带Mithril.js的Firefox 32和Chrome 37,现在反复被变量名中的拼写错误绊倒,只是无声地导致JS在引用点停止执行。对于来自C和Java的我来说,这尤其令人沮丧,因为我已经习惯了编译器在尝试运行代码之前就捕捉到了这些琐碎的错误。

我将问题缩小为仅在作为AJAX Promise链的一部分运行的函数中出现,如下所示:

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中的错误。

最佳答案

长话短说,这是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合并之前的最新版本)会扔到控制台。

Mithril 0.1.22将附带一个Promise异常监视器,该监视器将允许您配置如何尽早捕获Promise异常(并且默认情况下会抛出该错误,以向程序员提供控制台)。您可以在开发版本库中找到此版本。

09-16 01:36