为什么我的对象变量为空?

时间:2017-11-09 17:25:04

标签: javascript ajax object

所有

我有一些使用多个变量,对象和数组的代码。 不知怎的,我填充的对象现在是空的。

var items = [];
var countryCode = "";
var message = "";
var dataset = {};
var countryData = {};
countryData.fillKey = 'NEW';

function getItems(url) {
$.ajax({
    url: _spPageContextInfo.webAbsoluteUrl + url,
    type: "GET",
    headers: {
        "accept": "application/json;odata=verbose",
    },
    success: function (data) {
             var items = data.d.results;
             for(var i = 0; i < items.length;i++) {
             countryCode = items[i].Country0.Column2;                         
             message = countryData.fillKey;
             dataset[countryCode] = message;
                          }
    },
    error: function (error) {
        alert(JSON.stringify(error));
    }
});
}

当我在此代码之后测试数据集时,它是空的。它应该是这样的:

dataset['UKR'] = countryData;
dataset['USA'] = countryData;
dataset['RUS'] = countryData;

为什么这不起作用?

我的下一个代码必须使用数据集:

var map = new Datamap({
    element: document.getElementById('container'),
    geographyConfig: {
            hideAntarctica: true,
            highlightFillColor: false,
            popupOnHover: true,
            highlightOnHover: false,
            borderColor: '#000000',
            borderWidth: 0.5
            },
            fills: {
                'NEW': '#FF0000',
                'OLD': '#FF7F7F',
                defaultFill: '#FFFED9' 
                      },
               data: dataset
                     });
            map.svg.call(d3.behavior.zoom().on("zoom", redraw));

function redraw() {
map.svg.selectAll("g").attr("transform", "translate(" + d3.event.translate + ")scale(" + d3.event.scale + ")");
            }

});

2 个答案:

答案 0 :(得分:0)

您可以将回调传递给getItems函数,以便在请求成功后调用。

以下是您需要获取项目,然后使用该数据执行某些操作的方案的简短示例。

function processItems() {
  getItems('the/items/url', (dataset) => {
    var map = new Datamap({
      element: document.getElementById('container'),
      geographyConfig: {
        hideAntarctica: true,
        highlightFillColor: false,
        popupOnHover: true,
        highlightOnHover: false,
        borderColor: '#000000',
        borderWidth: 0.5
      },
      fills: {
        'NEW': '#FF0000',
        'OLD': '#FF7F7F',
        defaultFill: '#FFFED9'
      },
      data: dataset
    });
    map.svg.call(d3.behavior.zoom().on("zoom", redraw));

    function redraw() {
      map.svg.selectAll("g").attr("transform", "translate(" + d3.event.translate + ")scale(" + d3.event.scale + ")");
    }
  });
}


function getItems(url, callback) {
  $.ajax({
    url: _spPageContextInfo.webAbsoluteUrl + url,
    type: "GET",
    headers: {
      "accept": "application/json;odata=verbose",
    },
    success: function(data) {
      var items = data.d.results;
      for (var i = 0; i < items.length; i++) {
        countryCode = items[i].Country0.Column2;
        message = countryData.fillKey;
        dataset[countryCode] = message;
      }
      callback(dataset);
    },
    error: function(error) {
      alert(JSON.stringify(error));
    }
  });
}

答案 1 :(得分:0)

所以我解决了。有时事情就在你面前,但你却看不到它。 只需要将异步设置为FALSE。

function getItems(url) {
$.ajax({
url: _spPageContextInfo.webAbsoluteUrl + url,
type: "GET",
async: false,
headers: {
    "accept": "application/json;odata=verbose",
},
success: function (data) {
         var items = data.d.results;
         for(var i = 0; i < items.length;i++) {
         countryCode = items[i].Country0.Column2;                         
         message = countryData.fillKey;
         dataset[countryCode] = message;
                      }
},
error: function (error) {
    alert(JSON.stringify(error));
}
});
}