2012-08-07 50 views
0

我dataHelper.js文件的内容:调用从模块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() { 
       } 
      }); 
     } 
    };  
}); 

我想如下从我的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变量。非常感谢。

回答

0

我看到的第一个问题是你正在将一个异步进程当作同步进程对待。​​在发送到服务器的请求后立即返回,直到收到响应才会阻止。

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

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

另外请注意,上述不使用任何基底道场模块除了dojo/_base/xhr,所以没有必要将它们包括(除非它们是此代码段外使用)。

您需要更新您的代码才能异步处理此调用。为此,您可以利用​​方法返回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) 
    }); 
}); 
+0

感谢@BuffaloBuffalo它看起来不错,但是dataHelper.js没有加载。我收到以下错误: 错误:multipleDefine return mix(new Error(error),{src:“dojoLoader”,info:info}); TypeError:dataHelper未定义 [Break On This Error] \t var deferred = dataHelper.getJSON(); 我认为值得补充的是,我有另一个js文件与dataHelper在同一个文件夹中,我可以加载没有问题。 – L4zl0w 2012-08-07 13:54:56

+0

你可以用你如何加载dataHelper模块的上下文来更新你的问题吗? dojo安装的文件夹结构(您的自定义模块所在的位置)以及您的dojoConfig参数也会有所帮助。 – BuffaloBuffalo 2012-08-07 15:26:09

+0

谢谢你很快就会这么做。 – L4zl0w 2012-08-07 17:58:51

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

});