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ないため、それらを含める必要はありません (このスニペットの外部で使用されている場合を除きます)。

この呼び出しを非同期で処理するには、コードを更新する必要があります。これを行うには、メソッドがDeferredオブジェクトxhr.getを返すという事実を利用できます。このクラスにより、一貫した方法での非同期処理が非常に簡単になります。

これを行うには、xhr 呼び出しの結果を返すように dataHelper モジュールを更新します。

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 に答える