2

Duktape の上で promise を使用するにはどうすればよいですか?

私のシナリオ: Web ブラウザーで適切に読み込まれるクライアント側の JavaScript コードを Duktape に移行します。JavaScript を実行するために、Dukluv (Duktape および libuv ライブラリとのバインディング) バイナリを使用しています。ただし、私の JavaScript はBlueBird ライブラリに依存しています。

実行しようとすると、エラーが発生します。 no async scheduler available

問題は bluebird の schedule.js の 33 行目にあります。参照用のコードは次のとおりです。

else if ((typeof MutationObserver !== "undefined" &&
         (_MutationObserver = MutationObserver)) ||
         (typeof WebKitMutationObserver !== "undefined" &&
         (_MutationObserver = WebKitMutationObserver))) {
    schedule = (function() {
        var div = document.createElement("div");
        var queuedFn = void 0;
        var observer = new _MutationObserver(
            function Promise$_Scheduler() {
                var fn = queuedFn;
                queuedFn = void 0;
                fn();
            }
       );
        observer.observe(div, {
            attributes: true
        });
        return function Promise$_Scheduler(fn) {
            queuedFn = fn;
            div.classList.toggle("foo");
        };

    })();
}

ブラウザーなしで Dukluv でスクリプトを実行しているため、webkitmutationobserver もドキュメント オブジェクトもありません。

Q ライブラリも使用しようとしましたが、それでもエラーが発生しますsetTimeout not defined。可能であれば、コードのスニペットを使用して解決策を提案してください。ありがとう

4

1 に答える 1

1

Bluebird では、これらのシナリオのスケジューラを正確に明示的に設定できます。関数を直接実行する方法を bluebird に伝える必要があります。

Promise.setScheduler(function(fn){ // fn is what to execute
    var timer = uv.new_timer.call({});
    uv.timer_start(timer, 0, 0, fn); // add the function as a callback to the timer
});

すべての promise コードの上でこれを実行します。これにより、上記のエラーが解決されます。

于 2014-12-12T01:05:17.813 に答える