0

非同期呼び出しの処理で問題が発生しました。

たとえば、requirejsを使用していくつかのモジュールを動的にロードしたいとします。現在、私はサブスクライバーパブリッシャーパターンを使用しています。残念ながら、これはある状況で私のコードを本当に混乱させます...:

オブジェクトに作業イベントシステムがあると想像してください

var loader = {
    load: function(modules) {
        // do a async requirejs call
        require(modules, function(){
            // map arguments to normal array
            var modules = [].slice().call(arguments);
            // fire loaded event, pass modules
            this.trigger('loaded', modules);
        }.bind(this));
    }
};


var parent = {
    // do some initialization work
    initialize: function() {
        // execute the second initialization when our modules have finished loading async
        loader.on('loaded', this.secondInitialize, this);
        // require the given modules in the array
        loader.load(['one', 'two', 'three']);
    },

    secondInitialize: function(modules) {
        var three = new modules[2]();
        // do something with the 'three' module
    }

};

ご覧のとおり、これは本当に紛らわしいです。

非同期呼び出しの適切な処理を可能にする他のデザインパターンはありますか?

4

1 に答える 1

3

jQueryDeferredオブジェクトを調べます。(jqがなくても、ほとんどのライブラリにはjavascript promiseが実装されています)

これを使用すると、次のようなことができます。

var loadingOne = getLibOne(); //returns a jquery deferred promise
var loadingTwo = getLibTwo(); //returns another one

var loadingAllLibraries = $.when(loadingOne, loadingTwo);
loadingAllLibraries.done(function(lib1, lib2) {
  //... stuff
});

正確にはあなたのシナリオではありませんが、あなたはアイデアを得ることができます。非同期アトムの作成は比較的簡単になります。

于 2012-09-16T14:22:08.603 に答える