1

サードパーティのコードがコールバックを実行している状況があります

YUI({
  delayUntil: 'domready'
}).use(....)

私の問題は、コードに別の非同期スクリプト ローダーを使用していて、スクリプトが読み込まれるまでそのコールバックを遅らせる必要があることです。YUI をテスト ページに挿入するユニット テストに Yeti を使用しています。それ以外の場合、私のコードは YUI とは何の関係もありません。

jQuery には、jQuery を介して登録された domready ハンドラーの実行をしばらく遅らせる holdReady メソッドがあります。YUIに同等の方法があるかどうか疑問に思っています。これはテスト ページ用であり、テスト対象のコードは YUI を使用していないため、解決策に醜いハックが含まれていても問題ありません。

編集:

Yeti は独自のスコープ付き YUI オブジェクトを使用していることが判明しましたが、とにかくそれにアクセスする方法がないため、この質問に対する答えが見つかったとしても、ここでは役に立ちません。YUI でドキュメントの準備ができているハンドラーを延期する方法を見つけずに、Yeti 固有の問題をどのように修正したのか疑問に思っている人のために、私のコードを次に示します。

!function(){
    var mochaListeners = [];
    var fakeRunner;
    // Stub for Yeti in case mocha isn't loaded on domready
    window.mocha = {
        run : function(){
            return fakeRunner = {
                on : function(type, fn){
                    mochaListeners.push([type, fn]);
                }
            };
        }
    };
    yepnope([
        {
            load : [
                'assets/lib/lodash.js',
                'assets/lib/jquery.js',
                'assets/lib/css/mocha.css',
                'assets/lib/mocha.js', 
                'assets/lib/chai.js', 
                'assets/lib/sinon.js'
            ],
            complete : function(){
                mocha.setup('bdd')
            }
        },{
            load : 'assets/js/my_tests.js',
            complete : function(){
                executeTests = function(){
                    var runner = mocha.run();
                    runner.ignoreLeaks = true;
                    _.forEach(mochaListeners, function(listener){
                        runner.on(listener[0], function(){
                            _.extend(fakeRunner, runner);
                            listener[1].apply(this, arguments);
                        });
                    });
                };
                if(document.readyState === 'complete')
                    executeTests();
                else
                    $(executeTests);
            }
    }]);
}();
4

0 に答える 0