无法获取未定义或空引用的属性“ d”

时间:2018-08-05 03:49:39

标签: javascript ajax sharepoint sharepoint-2013

我正在使用Promise查询我的SharePoint 2013列表,但是出现异常行为。从下面的代码中可以看到,'promise.responseJSON.d.results.length == 1'条件的值返回错误,但是如果我注释掉if语句生成和console.log(promise.responseJSON.d。 results.length),我得到的值为1。我不明白为什么会这样。

$(document).ready(function() {
  var promise = getData();
  promise.done(function(data) {
    return data;
  });

  console.log(typeof(promise));

  //returns an error 'unable to get property 'd' of undefined or null reference
  if (promise.responseJSON.d.results.length === 1) {
    alert("show ED DOM Elements");
  } else {
    alert("Do not show ED DOM Elements");
  }
  console.log(promise.responseJSON.d.results.length); //returns 1 if I comment out the if statement above

});

function getData() {
  //console.log(itemID);
  var itemID = getQueryString("ID");
  var endPointUrl = _spPageContextInfo.webAbsoluteUrl + "/_api/web/lists/getbyTitle('Document Approval')/items?$filter=(BackToAD eq 'Yes') and  (ID eq " + itemID + ")";
  console.log(endPointUrl);

  var headers = {
    "accept": "application/json;odata=verbose"
  };

  return $.ajax({
    url: endPointUrl,
    type: "GET",
    headers: headers

  });
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

从promise返回的对象的图像,显​​示“ d”确实存在 enter image description here

任何帮助和见识将不胜感激。这使我疯狂了几个小时。

谢谢!

1 个答案:

答案 0 :(得分:1)

您仍在尝试访问done处理程序之外的数据,结果会出现错误。您需要谨慎使用异步请求信任浏览器的console.log,因为它们通常会在调用console.log之后显示状态。这是使用代码简化版本的示例:

$(document).ready(function() {
  var promise = getData();
  promise.done(function(data) {
    console.log("promise readystate in done", promise.readyState);
    if (promise.responseJSON.userId)
      console.log("data inside done", promise.responseJSON);
  });

  console.log("promise readystate outside of done", promise.readyState);
  // uncommenting the line below will throw an error becuase responseJSON is not defined yet
  // console.log("data outside of done: ", promise.responseJSON.userId)
});

function getData() {
  var endPointUrl = 'https://jsonplaceholder.typicode.com/todos/1'
  var headers = {
    "accept": "application/json;odata=verbose"
  };
  return $.ajax({
    url: endPointUrl,
    type: "GET",
    headers: headers
  });
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

请注意,done函数外部的诺言就绪状态为1done内的means the request hasn't even been sent yet.真实状态为4,表示状态已完成。

这一切都意味着您需要处理done()中的数据处理逻辑或从done()调用函数并传递数据。