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

unable to get property 'd' of undefined or null reference

我正在使用承诺查询我的 SharePoint 2013 列表,但出现异常行为。正如您将从我下面的代码中看到的那样,'promise.responseJSON.d.results.length == 1' 条件 returns 的值是一个错误,但是如果我注释掉生成的 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' 确实存在

任何帮助和见解将不胜感激。这让我发疯了几个小时。

谢谢!

您仍在尝试访问 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 函数外部的承诺就绪状态是 1 means the request hasn't even been sent yet.done 内部,真正的状态是 4 这意味着它是完全的。

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