【问题标题】:Why is my object variable empty? [duplicate]为什么我的对象变量为空? [复制]
【发布时间】:2017-11-09 17:25:03
【问题描述】:

全部,

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

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

});

【问题讨论】:

  • 您正在发出 Web 请求,因此在您测试数据集时请求可能尚未完成。
  • 这段代码中发生了什么导致它“不起作用”?什么错误?
  • ajax 调用是异步的,javascript 在调用完成之前继续执行。如果您在 ajax 调用后立即检查数据集对象的值,它将为空,因为 success 尚未触发。如果您需要对数据集执行某些操作,只需在 success 中创建后将其作为参数传递即可@
  • IrkenInvader,如何将其作为参数传递?
  • 我的下一个代码必须使用数据集:

标签: javascript ajax object


【解决方案1】:

您可以将回调传递给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));
    }
  });
}

【讨论】:

  • 谢谢,代码在 $(document).ready(function () {
  • 我不这么认为,如果你想的话,你可以在函数内部定义函数:)
  • 有人建议将我的下一个代码放在成功函数中。那是不是回调(数据集)?
  • 您可以将下一个代码放在成功函数中,但它可能会变得混乱。回调(数据集)让您在成功函数之后继续,而不会使success 过于混乱
  • IrkenInvader,你能发布一下我不是专业人士的样子吗:)
【解决方案2】:

所以我解决了。有时事情就在你面前,但你看不到它。 只需将 async 设置为 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));
}
});
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-24
    • 2012-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-28
    相关资源
    最近更新 更多