从Dojo中的模块调用JSON函数

从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",

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",
                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参数也会有所帮助。