JS/jQuery で実装されたアプリケーションにステータス値の辞書を提供しようとしています。値はサーバー (ajax) から取得する必要があります。初期化中にそのリクエストを開始できるように、非同期でそれを行いたいと考えています。コードを理解しやすくするために、値への実際のアクセスは後で同期的に行う必要があります。(かなり) 単純化されたコードは現在、次のようになっています。
初期化:
$(document).ready(function(){
Status.fetch();
})
構造:
Status:{
Valid:new $.Deferred(),
Server:{},
/* ... */
fetch:function(){
if (Status.Valid.isResolved()){
// status already present due to a past request
return Status.Valid.promise();
}else{
// fetch status information from server
$.ajax({
type: 'GET',
url: 'status.php'),
cache: true,
dataType: 'json'
}).done(function(response){
$.each(response,function(key,val){
Status.Server[key]=val;
});
Status.Valid.resolve(Status.Server);
}).fail(function(response){
Status.Valid.reject(NaN);
});
return Status.Valid.promise();
}
}, // Status.fetch
getServerAspect:function(aspect){
$.when(
Status.fetch()
).done(function(server){
return server[aspect];
}).fail(function(server){
return NaN;
})
/* whyever: processing always comes here, which I don't understand... */
}, // Status.getServerAspect
} // Status
Status.Server
ajax呼び出しによって満たされます(これは機能します)。は、構造Status.getServerAspect()
内に格納されたアスペクトへの同期アクセスを許可するメソッドの例です(これは機能しません)。Status.Server
基本的な考え方は、構造体がアクセスされる前に、構造体の非同期充填が実行されるというものです。すべての(同期)アクセスは、参照されたアスペクトをすぐに返すか、その値が存在するまでブロックすることを意味します。しかし、 内でどのようなスタイルを試してStatus.getServerAspect()
も、メソッドは呼び出しスコープで使用できるアスペクト値なしですぐに戻ります。
遅延オブジェクトを操作する基本概念を理解するのに明らかに問題があります。私はそれらを常に同期処理に使用していますが、魅力のように機能します。ただし、これは、アプリケーション全体で非同期スタイルを使用する必要があることを意味します。この特別な機能では、条件式をシンプルに保つために、同期スタイルを好みます。
if ('somevalue'==Status.getServerAspect('someaspect'))
...do something...
非同期処理と同期処理の間に「ブリッジ」を構築するためのトリックは何ですか?