0

我的 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() {
                }
            });
        }
    };      
});

我正在尝试从我的 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变量中。非常感谢。

4

2 回答 2

0

我看到的第一个问题是您将异步进程视为同步进程。向xhr.get服务器发送请求后立即返回,直到收到响应才会阻塞。

首先,我将在console.log您的模块定义中添加一个以确保您的 dataHelper 模块被正确加载。

define(["dojo/_base/xhr"], 
function(xhr){
    console.log('dataHelper.js loaded');
    return {
    //
    };
});

另请注意,上面您没有使用除 之外的任何基本 dojo 模块dojo/_base/xhr,因此没有必要包含它们(除非它们在此代码段之外使用)。

您需要更新代码以异步处理此调用。为此,您可以利用该xhr.get方法返回Deferred对象这一事实。这个类使得以一致的方式处理异步非常容易。

为此,请更新 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)
    });
});
于 2012-08-07T12:38:54.967 回答
0

这是我的建议:

您的 dataHelper.js 文件:

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
    });

});
于 2012-08-07T19:05:58.150 回答