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
가져옵니다. Status.getServerAspect()
은 Status.Server
구조 (은 아니요,이 아님) 내에 저장된 애스펙트에 대한 동시 액세스를 허용하는 방법의 한 예입니다.
기본 아이디어는 구조체에 액세스하기 전에 구조체의 비동기식 채우기가 실행된다는 것입니다. 모든 (동기식) 액세스는 해당 값이 나타날 때까지 참조 된 부분을 즉시 반환하거나 차단합니다. 그러나 어떤 스타일이든지 내에서 Status.getServerAspect()
을 시도해도 메소드는 호출 범위에서 사용할 수있는 애스펙트 값없이 즉시 반환됩니다.
지연된 개체로 작업하는 기본 개념을 이해하는 것은 분명히 문제가 있습니다. 나는 항상 동기 처리를 위해 그것들을 사용하고, 매력처럼 작동한다. 그러나 이는 애플리케이션 전반에 걸쳐 비동기식 스타일을 사용해야한다는 것을 의미합니다.
if ('somevalue'==Status.getServerAspect('someaspect'))
...do something...
동기 및 비동기 처리 사이에 '다리'를 구축 할 수있는 트릭은 무엇입니까 : 조건식 간단한 유지되도록이 특별한 기능을 위해 나는, 동기 스타일을 선호?
데이터가있을 때까지 무엇을 "차단"합니까? 내가 아는 한, 그건 아약스 동기화를하지 않는 현대의 브라우저에서는 불가능합니다. –
@KevinB 비동기 가져 오기 프로세스에 의해 해결되는 지연된 객체를 사용하려고합니다. 나중에'지연된 객체를 사용하여'$ .when' 내부에서 평가함으로써 접근을 차단하려고합니다. 적어도 그 생각은 ... – arkascha
맞습니다. '.done()'콜백에서 데이터를 반환 할 수 없습니다. –