从Dojo中的模块调用JSON函数
my dataHelper.js文件的内容:从Dojo中的模块调用JSON函数,json,dojo,Json,Dojo,my dataHelper.js文件的内容: define(["dojo/_base/declare", "dojo/dom", "dojo/_base/xhr", "dojo/json"], function(declare, dom, xhr, json){ return { getJSON: function(){ xhr.get({ url: "../../cpuusage.json",
define(["dojo/_base/declare", "dojo/dom", "dojo/_base/xhr", "dojo/json"],
function(declare, dom, xhr, json){
return {
getJSON: function(){
xhr.get({
url: "../../cpuusage.json",
handleAs: "json",
load: function(jsonData){
return jsonData;
},
error: function() {
}
});
}
};
});
define("dataHelper", ["dojo/_base/declare", "dojo/dom", "dojo/_base/xhr"],
function(declare, dom, xhr){
return declare("dataHelper", [], {
getJSON: function(){
return xhr.get({
url: "../../cpuusage.json",
handleAs: "json"
});
});
};
});
我正在尝试从我的index.html运行此命令,如下所示:
var chartData = dataHelper.getJSON();
我想我有几个问题。首先,我不确定我的模块和getJSON函数是否定义正确。其次,我的控制台出现错误:
TypeError: this.source is undefined
[Break On This Error]
= [],
dojo.js (line 362)
SyntaxError: missing : after property id
},
dojo.js (line 330)
SyntaxError: missing : after property id
},
dojo.js (line 330)
SyntaxError: missing : after property id
},
我首先要实现的就是将json数据加载到chartData变量中。非常感谢。我看到的第一个问题是,您将异步进程视为同步进程。请求发送到服务器后,
xhr.get
会立即返回,直到收到响应后才会阻塞
首先,我将在模块定义中添加一个console.log
,以确保正确加载dataHelper模块
define(["dojo/_base/xhr"],
function(xhr){
console.log('dataHelper.js loaded');
return {
//
};
});
还要注意的是,除了dojo/\u base/xhr
,上面没有使用任何基本dojo模块,因此没有必要包含它们(除非它们在这个代码段之外使用)
您需要更新代码以异步处理此调用。为此,您可以利用xhr.get
方法返回对象这一事实。这个类使得以一致的方式处理异步变得非常容易
为此,请更新dataHelper模块以返回xhr调用的结果:
define(["dojo/_base/xhr"], function(xhr){
return {
getJSON: function(){
//this returns a Deferred object, what to do on load and error is then handled by the invoker
return xhr.get({
url: "../../cpuusage.json",
handleAs: "json"
});
}
};
});
然后,在使用此模块时:
//replace dataHelper with whatever it's path is
require(['dataHelper'],function(dataHelper){
var deferred = dataHelper.getJSON();
deferred.then(function(data){
//this function is invoked once the data has been fully loaded
}, function(error){
//this function is invoked if an error occurs while loading the data (in case of a server error response or if the response isn't in the format you specified)
});
});
这是我的建议:
您的dataHelper.js文件:
define(["dojo/_base/declare", "dojo/dom", "dojo/_base/xhr", "dojo/json"],
function(declare, dom, xhr, json){
return {
getJSON: function(){
xhr.get({
url: "../../cpuusage.json",
handleAs: "json",
load: function(jsonData){
return jsonData;
},
error: function() {
}
});
}
};
});
define("dataHelper", ["dojo/_base/declare", "dojo/dom", "dojo/_base/xhr"],
function(declare, dom, xhr){
return declare("dataHelper", [], {
getJSON: function(){
return xhr.get({
url: "../../cpuusage.json",
handleAs: "json"
});
});
};
});
您的调用:
require(["dataHelper"], function(dataHelper) {
var chartData;
dataHelper.getJSON().then(function(jsonData) {
chartData = jsonData;
//Continue doing stuff with chartData in here, not outside
});
});
谢谢@buffalo,看起来不错,但是dataHelper.js没有加载。我得到以下错误:错误:multipleDefine返回混合(新错误(Error),{src:“dojoLoader”,info:info});TypeError:dataHelper未定义[Break On This Error]var deferred=dataHelper.getJSON();我认为值得补充的是,我有另一个js文件,它与dataHelper位于同一个文件夹中,我可以加载它,没有问题。您能用如何加载dataHelper模块的上下文更新您的问题吗?dojo安装的文件夹结构(自定义模块所在的位置)以及dojoConfig参数也会有所帮助。