Jquery 使用“延迟”获取列表项
我正在处理这个代码。我需要在第一个循环的基础上添加另一个ajax来获取列表项。除非写入警报(“等待”),否则结果不正确 我调用下面的函数两次以获取列表项Jquery 使用“延迟”获取列表项,jquery,ajax,rest,sharepoint,Jquery,Ajax,Rest,Sharepoint,我正在处理这个代码。我需要在第一个循环的基础上添加另一个ajax来获取列表项。除非写入警报(“等待”),否则结果不正确 我调用下面的函数两次以获取列表项 function loadRestRequest(url, callback) { var async = true; var res = null; if(callback == null) { async = false; callback = function (data) {
function loadRestRequest(url, callback) {
var async = true;
var res = null;
if(callback == null)
{
async = false;
callback = function (data) {
res = data.d;
}
}
$.ajax
url: url,
typ({
e: "GET",
async: async,
headers: {
"accept": "application/json;odata=verbose",
},
success: callback,
error: function (error) {
alert(JSON.stringify(error));
}
});
return res;
}
我用谷歌搜索了这个问题,发现这些函数没有同步。调用wait或sleep函数无法正常工作,因为无法准确估计查询时间。我应该使用$.Deferred,但我不知道如何在loadRestRequest函数中使用它。
我的代码正在sharepoint 2013上运行,用于查询可以利用的异步请求列表
避免async=false
Per:
从jQuery1.8开始,在jqXHR($.Deferred)中使用async:false是不正确的
不赞成;您必须使用成功/错误/完成回调选项
反而
示例
该示例演示如何链接异步调用(主查询和子查询列表):
我学习异步ajax回调。这有助于我理解done()和then()之间的区别。下面的代码解决了我的问题,所有动作回调都在ajax成功函数中进行,之后在done()中进行一些需要在回调后运行的操作
loadRestRequest("/_api/Web/lists/GetByTitle('KSF')/items?$filter=Master eq 94 ").done(function (data) {
$.each(data.d.results, function (idx, val)
//do some stuff after first callback
ksfId = val.ID;
loadRestRequest1("/_api/Web/lists/GetByTitle('KPI')/items?$filter=KSF eq " + ksfId).done(function (data){
//do some stuff after second callback
})
});
});
代码顶部还使用了两个单独的函数
function loadRestRequest(url) {
var dfd = $.Deferred();
$.ajax
url: url,
typ({
e: "GET",
async: true,
headers: {
"accept": "application/json;odata=verbose",
},
success: function (data) {
//do some stuff that you need result
dfd.resolve(data);
},
error: function (error) {
alert(JSON.stringify(error));
dfd.reject(error);
}
});
return dfd;
}
function loadRestRequest1(url) {
var dfd = $.Deferred();
$.ajax
url: url,
typ({
e: "GET",
async: true,
headers: {
"accept": "application/json;odata=verbose",
},
success: function (data) {
//do some another stuff that you need result
dfd.resolve(data);
},
error: function (error) {
alert(JSON.stringify(error));
dfd.reject(error);
}
});
return dfd;
}
谢谢你,瓦迪姆,我的问题解决了。我在留下注释时没有使用promissions(),代码中使用了resolve()和done()。
function getRequest(url){
return $.ajax({
url: url,
method: "GET",
headers: { "Accept": "application/json; odata=verbose" },
});
}
var mainQueryResult = null;
var subQueriesResult = null;
var requestUrl = _spPageContextInfo.webAbsoluteUrl + "/_api/web/lists/getbytitle('Site Pages')/items";
getRequest(requestUrl)
.then(function(data){
mainQueryResult = data.d.results;
var promises = $.map(data.d.results, function(item) {
var subRequestUrl = _spPageContextInfo.webAbsoluteUrl + "/_api/web/lists/getbytitle('Site Pages')/items(" + item.Id + ")";
return getRequest(subRequestUrl);
});
return $.when.apply($, promises);
})
.then(function(){
subQueriesResult = $.map(arguments, function (args,idx) {
return args[0].d;
})
//print results
console.log(mainQueryResult);
console.log(subQueriesResult);
});
loadRestRequest("/_api/Web/lists/GetByTitle('KSF')/items?$filter=Master eq 94 ").done(function (data) {
$.each(data.d.results, function (idx, val)
//do some stuff after first callback
ksfId = val.ID;
loadRestRequest1("/_api/Web/lists/GetByTitle('KPI')/items?$filter=KSF eq " + ksfId).done(function (data){
//do some stuff after second callback
})
});
});
function loadRestRequest(url) {
var dfd = $.Deferred();
$.ajax
url: url,
typ({
e: "GET",
async: true,
headers: {
"accept": "application/json;odata=verbose",
},
success: function (data) {
//do some stuff that you need result
dfd.resolve(data);
},
error: function (error) {
alert(JSON.stringify(error));
dfd.reject(error);
}
});
return dfd;
}
function loadRestRequest1(url) {
var dfd = $.Deferred();
$.ajax
url: url,
typ({
e: "GET",
async: true,
headers: {
"accept": "application/json;odata=verbose",
},
success: function (data) {
//do some another stuff that you need result
dfd.resolve(data);
},
error: function (error) {
alert(JSON.stringify(error));
dfd.reject(error);
}
});
return dfd;
}