我正在使用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>
任何帮助和见识将不胜感激。这使我疯狂了几个小时。
谢谢!
答案 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
函数外部的诺言就绪状态为1
,done
内的means the request hasn't even been sent yet.真实状态为4
,表示状态已完成。
这一切都意味着您需要处理done()
中的数据处理逻辑或从done()
调用函数并传递数据。