我正在尝试为在 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...
在异步和同步处理之间建立“桥梁”的技巧是什么?