通过调用dojo模块返回对象存储值

通过调用dojo模块返回对象存储值,dojo,Dojo,我希望通过调用dojo模块获得一个值(对象存储),但我一直没有定义: 模块: define(['dojo/store/Memory','dojo/_base/xhr','dojo/data/ObjectStore'], 函数(内存、xhr、对象存储){ var oReachStore; 返回{ 到达:函数(url){ get({//从数据库获取数据 url:url, //url:url, handleAs:“json”, 加载:函数(结果){ var ReachData=result.GetRe

我希望通过调用dojo模块获得一个值(对象存储),但我一直没有定义:

模块:

define(['dojo/store/Memory','dojo/_base/xhr','dojo/data/ObjectStore'],
函数(内存、xhr、对象存储){
var oReachStore;
返回{
到达:函数(url){
get({//从数据库获取数据
url:url,
//url:url,
handleAs:“json”,
加载:函数(结果){
var ReachData=result.GetReachesResult;
var ReachStore=新内存({data:ReachData,idProperty:“label”});
oReachStore=newObjectStore({ObjectStore:ReachStore});
},
错误:函数(err){}
});
},
getreaces:function(){
返回商店;
}
}
});
呼叫模块:

Data.reach(dataServiceUrl)//设置到达对象存储
ReachData=Data.getreaces()//获取到达对象存储,但始终未定义

我需要对函数GetReach使用回调函数。以下修改的代码有效: 模块:

define(['dojo/store/Memory','dojo/_base/xhr','dojo/data/ObjectStore'],
函数(内存、xhr、对象存储){
返回{
GetReach:函数(url、回调){
get({//从数据库获取数据
url:url,
//url:url,
handleAs:“json”,
加载:函数(结果){
var ReachData=result.GetReachesResult;
var ReachStore=新内存({data:ReachData,idProperty:“label”});
var oReachStore=newobjectstore({ObjectStore:ReachStore});
回调(oReachStore);
},
错误:函数(err){}
});
}
}
});
从主页呼叫:

/。。。。
GetReach(dataServiceUrl,SetReach);
功能SetReach(数据){
//为下拉列表设置数据
ddReach.setStore(数据);
}

正如您现在可能注意到的(通过阅读答案),您正在使用异步查找(在本例中XMLHttpRequest是异步的),但在设置之前,您依赖于该存储

一种可能的解决办法是使用承诺/延期。我不知道您使用的是哪个Dojo版本,但在Dojo<1.8中,您可以使用
Dojo/\u base/Deferred
模块,从1.8开始,您可以使用
Dojo/Deferred
模块。语法略有不同,但概念是相同的

首先将
oReachStore
更改为:

var oReachStore=new Deferred();
然后,在
reach
函数中,您不替换
oReachStore
,而是使用
Deferred::resolve()
函数,例如:

返回{
到达:函数(url){
get({//从数据库获取数据
url:url,
//url:url,
handleAs:“json”,
加载:函数(结果){
var ReachData=result.GetReachesResult;
var ReachStore=新内存({data:ReachData,idProperty:“label”});
resolve(ew ObjectStore({ObjectStore:ReachStore}));//注意区别
},
错误:函数(err){}
});
},
getreaces:function(){
返回商店;
}
}
然后在代码中可以使用:

Data.reach(dataServiceUrl)//设置到达对象存储
Data.getreaces().then(函数(ReachData){
console.log(ReachData);//不再是未定义的
});
因此,现在
ReachData
不会返回
undefined
,因为您正在等待它被解析

延迟实际上是JavaScript世界中的一种常见模式,与定义自己的回调相比,延迟实际上是一种更可靠的API。例如,如果XHR请求中出现错误,可以使用:

错误:函数(err){
拒绝(错误);
}

可以在JSFIDLE上找到一个简单的示例(我使用
setTimeout()
模拟了异步请求):

谢谢,我将改用这个方法