0

私は Dojo を初めて使用し、次のコードに苦労しています。最後に chartData が空である理由がわかりません。このメソッドは、Dojo サイトの例に基づいて作成しました。

コードは次のとおりです。

        function(xhr, json, arrayUtil, number, Chart, theme) {

            var chartData = [];

            var def = xhr.get({
                url: "cpuusage.json",
                handleAs: "json"
            });

            def.then(function(res){
                var data = [];

                    arrayUtil.forEach(res.chart, function(chart){
                        data[chart.x] = number.parse(chart.y);
                    });
                chartData = data;
                console.info("chartData1: ", chartData);
            }, function(err){
                console.error("Failed to load JSON data");
            });

def.then 内の最初の console.info は、chartData に正しい値があることを示しています。ただし、 def.then メソッドが終了した後に chartData の値を出力すると、空になります。

def.then 呼び出しの前後で chartData の値が同じであることを確認するにはどうすればよいですか。どうもありがとう

4

1 に答える 1

2

xhr のメソッドはすべて本質的に非同期ですが、promise を返します。xhr メソッドの後に何らかのコードを実行する場合は、次のようになります。

    function(xhr, json, arrayUtil, number, Chart, theme) {

        var chartData = [];

        xhr.get({
            url: "cpuusage.json",
            handleAs: "json",
            load: function(jsonData) {
                arrayUtil.forEach(jsonData.chart, function(chart){
                    chartData[chart.x] = number.parse(chart.y);
                });
                console.info("JSON loaded from server:  ", chartData);
            },
            error: function() {
                console.error("Failed to load JSON data");
            }
        }).then(function(jsonData){
             console.info("chartData: ", chartData);
        });

promise の then 関数を使用することで、AJAX 呼び出しの後にコードが実行されるようにします。

于 2012-08-07T18:23:12.180 に答える