2012-04-15 6 views
0

私はjQueryプラグインを開発しています。このプラグインは、ユーザーのブラウザ言語に応じて、ページ上の要素を自動的に解釈しているようです。翻訳は.jsonファイルに保存されます。いくつかの関数の結果で解決する約束を返すには?

あなたがプラグインを呼び出すと、あなたはパッケージ名(またはそれらの配列)を渡すと、それは次のように言語ファイルをロードしようとします:ブラウザの言語が単純な場合

  • 、例えば'en'であり、パッケージを指定しただけの場合は、以下をロードしようとします:packageName-en.json
  • ブラウザの言語が、例えば 'en-US'のように構成されている場合、以前と同じようにロードしようとしますが:packageName-en.jsonおよびpackageName-en-US.json
  • 複数のパッケージが表示されている場合、各パッケージの前の2つのパスのうちの1つに従うことを試みます。だから、

、プラグインで、私はこの持っている:

:この関数を呼び出します

loadLanguages : function(){ 
    $.each(self.options.packages,function(i, pkg){ 

    }); 
} 

:だから

$.fn.Translator = function(pkg, options){ 
    Translator.initialize(pkg, options).done(function(){ 
     return this.each(Translator.translate); 
    });    
}; 

を、どこかで私の初期化関数では、私はこれを持っています

getLanguage : function(pkg, language){ 
    var self = this, url; 
    if (self.options.path) 
     url = self.options.path + '/'; 
    url += [pkg, language].join('-'); 

    return $.ajax ({ 
     url : url, 
     dataType : "json", 
     cache : self.options.cache 
    }); 
} 

問題は、その関数はprobabl y複数回、私はどのようにinitializeは、すべての関数が呼び出されて解決される約束を返すようにするか分からない。

答えて

2

は、私はあなたが既に答えを受け入れたが、はるかに簡単な方法が存在しているはず。

function loadLanguages() { 
    return $.when.apply($, $.map(self.options.packages, function(pkg) { 
     return getLanguage(pkg, language); 
    })); 
} 
+0

私は答えを受けましたが、あなたの方が良いと思います。それは私が探していた解決策の一種であり、他の方法はちょっとハッキリしているようでした。ありがとうジュリアン:) –

0

この問題を解決するには、ダミーDeferrer(baseDfr)を作成し、ダミーをinitialize()の結果として返すことができます。ここでの考え方は、すべてgetLanguage()の呼び出しが完了したときにbaseDfr.resolve()に電話することです。カウンタを使用して行われたgetLanguage()コールの数を追跡します。カウンタが0になると、baseDfr.resolve()と呼ばれます。 返品遅延者のthen()またはdone()メソッドを$.ajaxで使用してgetLanguage()の呼び出しが行われたときはわかります。

これを解決するコードは、次のとおりです。また、実際の例(一部のdivで)はhttp://jsfiddle.net/c5NBr/です。コンソールを開いて、メッセージが正しい順序で表示されることを確認します。 $.whenを使用します。

var packages = []; 
var count = 0; 
var baseDfr = $.Deferred(); 
var language = "en"; 

function resolveFunction() { 
    // By using this approach it is possible to pass a 
    // parameter to this resolve function. 
    return function(){ 
     if (!(--count)) { 
      // Until count is 0, we won't resolve the base 
      // deferrer object. 
      // As long as this isn't called, the function 
      // done() of initialize won't be called either. 
      baseDfr.resolve(); 
     }  
    }; 
} 

function getLanguage (pkg, language){ 
    var self = this, url; 
    if (self.options.path) 
     url = self.options.path + '/'; 
    url += [pkg, language].join('-'); 

    return $.ajax ({ 
     url : url, 
     dataType : "json", 
     cache : self.options.cache 
    }).promise(); 
} 

function loadLanguages() { 
    $.each(self.options.packages,function(i, pkg){ 
     getLanguage(pkg, language).then(resolveFunction()); 
    }); 

    return baseDfr.promise();     
} 

function initialize(options) { 
    packages = options.packages; 
    count = options.packages.length;  

    return loadLanguages(); 
} 

var options = { 
    packages : $('div')   
}; 

initialize(options).done(function(){ 
    // This will only be called when baseDfr.resolve() is called. 
    console.log("Fired all getLanguage()."); 
}); 
関連する問題