2

私は Firefox 32 と Chrome 37 を使用しMithril.jsていますが、変数名のタイプミスに何度もつまずき、参照の時点で 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スクリプトはそこで停止しているように見えますが、aReferenceErrorがスローされます。ただし、何も記録されません。

私は、このコードで、それがキャッチされ、無視されていることを証明する方法に取り組んでいます: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()
    }
};

そのコミュニティの誰かが、私が何か間違ったことをしたのか、Promise チェーンを誤用しているのか (??)、Mithril.jsそれとも 0.1.21 のバグなのかを教えてくれることを願っています。

4

2 に答える 2

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 マージ前の最後のバージョン) はデフォルトでコンソールにスローします。

Mithril 0.1.22 には、Promise 例外を早期にキャッチする方法を構成できる Promise 例外モニターが同梱されます (デフォルトでは、プログラマー エラーをコンソールにスローします)。このバージョンは、開発リポジトリにあります。

于 2014-09-24T21:11:46.433 に答える
1

ハンドラー内でエラーがスローonFulfilledされると、promise が拒否されます。スペック: http: //promisesaplus.com/#point-42

解決策は次のとおりです。

abc.then(thrower, fail1).then(null, fail2)

fail2 でキャッチされます

于 2014-09-24T20:50:56.143 に答える