2013-09-30 6 views
5

は、私が名前にエンコード値を変換するために辞書を取得する必要があります。条件付きの約束私のスクリプトで

$.ajax({ 
    // retrieve dictionary 
}) 
.done(function(dictionary){ 
    // convert encoded values into names 
}) 
.done(function(){ 
    // run my application 
}); 

をしかし、時には辞書はすでに別のアプリケーションによってロードされているが、この場合には、私にはありません/ else文は、かなり重いです、それは短いようにする方法があるかどう

if (dictionary) { 
    // convert encoded values into names 
    // run my application 
} 
else { 
$.ajax({ 
    // retrieve dictionary 
}) 
.done(function(dictionary){ 
    // convert encoded values into names 
}) 
.done(function(){ 
    // run my application 
}); 
} 

この:

// load dictionary if needed 
// then run my application 
AJAX呼び出しを必要とします

注:私は擬似コードに$記号を使用しましたが、必ずしもjQueryと結びついているわけではありません。

+1

私のアプリケーションでは、この種のことをかなり行います。あなたが気になる点は、データが非同期的に取得された場合、既に取得されているかどうかにかかわらず、非同期メソッドでデータにアクセスする必要があります。なぜなら、それぞれの用途ごとに理由があるため、すぐに利用できるかどうか、またはフェッチする必要があるかどうかを示します。 –

+0

@ Beetroot-Beetroot非同期メソッドで既に取得したデータにどのようにアクセスするか説明できますか?たぶんコードや擬似コードの回答を投稿するのでしょうか? – Christophe

+0

すでに掲載されている回答を参照してください。それは男が説明しようとしていることです。 –

答えて

0

たぶん偽の約束を作成$。で?

var promise; 
if (dictionary) promise = $.when(dictionary); 
else { 
    promise = $.ajax({ 

    }) 
    .done(function(dictionary){ 
     // convert encoded values into names 
    }); 
} 

promise 
    .done(function(){ 
     // run my application 
    }); 
2

$.ajax()を正確に1回呼び出して、返された約束を(global-ish)dictionary変数に保存する必要があります。

次に、結果を使用するたびに、dictionary.then(...)と書いてください。
AJAXリクエストがすでに終了している場合、コールバックはすぐに実行されます。

+1

さて、それはどのように動作するのではありません。私の質問で言いましたように、たとえ自分のコードが始まっても、辞書はすでに存在しているかもしれません(私の制御下にない別のスクリプトによって読み込まれています)。この場合、最初のajax呼び出しは必要ありません。たとえば、辞書をlocalStorageに格納することができます。 – Christophe

+0

@Christophe:グローバルを事前解決済みの約束に設定し、とにかく '.then()'を呼び出します。 – SLaks

+0

ok、それは私が理解しようとしている、条件付き約束を書く方法です。 – Christophe

3

これは私が一般的に使用パターンです:

var done = function() { 
    //continue loading application 
} 

if(!dictionary) { 
    $.ajax({ 

    }) 
     .done(done); 
} else { 
    done.apply(this); 
} 

非常に類似したパターン、常に繰延オブジェクトを使用することを、以下のことができます:

var 
    dictionaryDeferred = new $.Deferred(), 
    dictionaryPromise = dictionaryDeferred.promise(); 

if(!dictionary) { 
    $.ajax({ 

    }) 
     .done(function() { 
      //do something with the response 
      dictionaryDeferred.resolve(); 
     }); 
} else { 
    dictionaryDeferred.resolve(); 
} 

dictionaryPromise.then(function() { 
    //continue loading application 
}); 
+0

ありがとうございました。私はチェインを簡単にするので、第2のパターンがより好きです。 1つの問題は、dictionaryPromiseの解決された値が2つのブランチ間で一貫していないことです(辞書がグローバル変数であるため私の場合は問題になりません)。 – Christophe

+0

ディクショナリが要求される場所でも 'dictionaryPromise'を使用する必要はありません。アプリケーションがロードされている場所で、' if(!dictionary ) 'がすでに存在しているかどうかはわかりません。 – Adam

+0

'new'の使用がオプションの場合、$ .Deferred()で 'new'を使用する理由は何ですか? –