2012-08-07 83 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 
    }); 

});