无法获取未定义或空引用的 属性 '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()
调用函数并传入数据。
我正在使用承诺查询我的 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()
调用函数并传入数据。