我正在处理此代码。我需要在顶部添加另一个ajax以获得基于第一个循环的列表项。除非写警报(“ WAIT WAIT”),否则结果不正确。
loadRestRequest("/_api/Web/lists/GetByTitle('KSF')/items?$filter=Master eq 94 " ,
function (data) {
$.each(data.d.results, function (idx, val) {
ksfId = val.ID;
//do some stuff
loadRestRequest("/_api/Web/lists/GetByTitle('KPI')/items?$filter=KSF eq " + ksfId,
function (data) {
//do some stuff
});
alert("WAIT WAIT");
});
});
我两次调用以下函数以获取列表项
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上运行
答案 0 :(得分:0)
要查询 async 请求列表,可以使用jQuery.when()
var promises = $.map(array, function(item) {
return $.ajax({
url: url,
method: "GET",
headers: { "Accept": "application/json; odata=verbose" },
});
});
return $.when.apply($, promises);
每official documentation避免使用async = false
:
从jQuery 1.8开始,对jqXHR($ .Deferred)使用async:false是 不推荐使用您必须使用成功/错误/完成回调选项 代替
示例
该示例演示如何链接异步调用(主查询和子查询列表):
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);
});
答案 1 :(得分:-1)
我了解异步ajax回调。 link可以帮助我理解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;
}