递归ajax查询



我希望有人能给我一个如何实现以下目标的指针。

目前,我有:

  • JS函数:一个jQuery AJAX查询,它将从SharePoint自定义列表中获取项目。

  • JS函数:它将把列表结果放入数据表中。

  • JS函数,可以将InitatorId转换为用户的真实名称(GetDisplayName)。

    function GetDisplayName(userid) {
    var requestUri = _spPageContextInfo.webAbsoluteUrl + "/_api/web/getuserbyid(" + userid + ")";
    var requestHeaders = { "accept" : "application/json;odata=verbose" };
    $.ajax({
    url : requestUri,
    contentType : "application/json;odata=verbose",
    headers : requestHeaders,
    success : GetDisplayNameSuccess,
    error : GetDisplayNameFail
    });
    }
    
    function populateMyOutstandingItems() {
    SP.SOD.executeFunc("sp.js", "SP.ClientContext", function() {
    SP.SOD.executeFunc("sp.runtime.js", "SP.ClientContext", function() {
    var context = SP.ClientContext.get_current();
    var queryUrl = "https://companyname.sharepoint.com/subsite/_api/Web/Lists/getbytitle('Read%20Requests')/GetItems"; //change the Url
    var camlXML = "<Query><Where><And><Eq><FieldRef Name='ReaderId' LookupId='True' /><Value Type='Integer'>" + _spPageContextInfo.userId + "</Value></Eq><Neq><FieldRef Name='Read' /><Value Type='Text'>YES</Value></Neq></And></Where></Query>"
    var requestData = { "query" :
    {"__metadata": 
    { "type": "SP.CamlQuery" }
    , "ViewXml": camlXML
    }
    };
    return jQuery.ajax({
    url: queryUrl,
    type: "POST",
    data: JSON.stringify(requestData),
    headers: {
    "X-RequestDigest": $("#__REQUESTDIGEST").val(),
    "Accept": "application/json; odata=verbose",
    "Content-Type": "application/json; odata=verbose"
    },
    success: onQuerySuccessMyOutstandingItems,
    error: onQueryErrorMyOutstandingItems
    });
    });
    });
    }
    function onQuerySuccessMyOutstandingItems(data) {
    var jsonData = data.d.results
    console.log(jsonData)
    $("#resultsDivMyOutstandingItems").dataTable( {
    "data" : jsonData,
    columns: [
    { data: "Document_x0020_Name" },
    { data: "Document_x0020_Library_x0020_Nam" },           
    { data: "Request_x0020_Made_x0020_Date" },
    { data: "InitatorId" },
    { data: "Request_x0020_ReadBy_x0020_Date" }, ],
    order: [[3, "asc"]]
    } ); }
    

目前,在数据表中,我有InitatorID(即30),但我希望在表中有用户的真实姓名。

我知道需要某种类型的递归AJAX查询,但我不确定实现这一点的最佳方法是什么,我希望有人能为我指明正确的方向。

在阅读了一些关于链接请求的内容后,我尝试了下面的代码,但我想这是错误的,因为Chrome抱怨出现了"意外的结局":

var request = $.ajax({
url: queryUrl,
type: "POST",
data: JSON.stringify(requestData),
headers: {
"X-RequestDigest": $("#__REQUESTDIGEST").val(),
"Accept": "application/json; odata=verbose",
"Content-Type": "application/json; odata=verbose"
}
}),
chained = request.then(function( data ) {
return $.ajax( spPageContextInfo.webAbsoluteUrl + "/_api/web/getuserbyid(" + data.InitatorId + ")",
{ data: { user: data.Title }} )
});
chained.done(function( data ) {
console.log(data)
});

简而言之,实现我想要做的事情的最佳方式是什么?

非常感谢Glen

我不确定我是否完全理解你的要求,所以这是我对这种情况的最佳猜测(如果我错了,请纠正我)

  1. 进行AJAX调用以从SharePoint自定义中获取项目列表列表,但是遗憾的是,该列表中的一列具有InitatorID而不是用户名
  2. 为了解决这个问题,我们想进行另一个AJAX调用,该调用将获得我们刚刚检索到的一组匹配InitatorID的用户名列表
  3. 一旦我们有了它,我们想把数据放在dataTable中显示

在不了解详细信息的情况下,我只会进行嵌套的AJAX调用。基本上,一旦第一个调用完成,就调用第二个AJAX函数。完成该操作后,请更新dataTable。类似于:

$.ajax({ 
url: MY_FIRST_URL,
data: myFirstData
}).done(function (data) {
// The first call gets completed after some time and the 'done' function is called.
// here, extract the various InitatorID values, and pass them to the
// second AJAX call, so you can then get the usernames for those Ids
var initatorIds = // ... do data massaging here to get the initatorIds 
// into the format you want from the 'data' variable
//  passed in the done function...
$.ajax({ 
url: MY_SECOND_URL,
data: initatorIds 
}).done(function (data2) {
// once the SECOND call is complete, populate the dataTables
var jsonData =  // ... some manipulation of data and data2 results
// to get the combined output you want. 
$("#resultsDivMyOutstandingItems").dataTable( {
"data" : jsonData,
columns: [
....
....
}); 
}).fail(function (jqXHR, textStatus) {
// do stuff if the second call fails
}); 
}).fail(function (jqXHR, textStatus) {
// do stuff if the first call fails
});

冒着使解决方案过于复杂的风险,我个人希望通过dataTable插件中的ajax功能将数据直接加载到表中(请在此处阅读更多信息)。但是,如果按照上面的方式进行布局可以最大限度地减少混乱,那就先这样做吧!

最新更新