1

モジュールをロードするために jQuery Deferred クラスを使用すると、奇妙な動作が発生します。「すべてのモジュールがロードされました」を書き込む完了したロードキューのコールバックは、キューが終了する前に発生します。遅延パターンの使用法は間違っていますか?

var ModuleMgr = {
    [...]
loadModule: function(name){
        var deferred = new $.Deferred();
        var module = ModuleMgr.getModuleByName(name);
        module.init(function(result){
            deferred.resolve(1);
        });
        return deferred;
    },

    loadAll: function(onReady, onError){
            var self = ModuleMgr;
        var promises = [];
        for ( var current in self.needLoading ){
            var module_name = self.needLoading.pop();
            try{
                var d = self.loadModule(module_name);
                promises.push(d.promise());
            }
            catch(e){
                console.log('Failed to load module' +module_name);
                self.needLoading.push(module_name);
                setTimeout(self.loadAll, 2000); // Try again
            }
        }

        $.when.apply(null, promises).then(
            function(status){
            console.log('All Modules loaded');
        }, function(status){
            console.log('Error happended: '+ status);
        }, function(status){
            console.log('Status'+ status);
        });
    }
}
4

0 に答える 0