2017-02-08 7 views
0

Я надеялся, что кто-то может дать мне указатель на то, как добиться следующего.Рекурсивный запрос ajax

В настоящее время у меня есть:

  • функция А JS: Запрос JQuery AJAX, который будет получать элементы из пользовательского списка SharePoint.

  • Функция JS: это приведет к тому, что результаты списка будут перенесены в datatable.

  • Функция 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"]] 
    }); } 
    

На данный момент в DataTable, я имею 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

ответ

0

Я не уверен, я полностью понимаю, что вы просите, так вот моя догадка в сценарии (пожалуйста, поправьте меня, если я ошибаюсь)

  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 
}); 

И на риск чрезмерного усложнения решения, я бы лично следить, чтобы загрузить данные непосредственно в таблицу с помощью функциональных возможностей AJAX найден в DataTable плагин (подробнее об этом here) , Но определенно, если это минимизирует путаницу, чтобы выложить это, как указано выше, сделайте это первым!

+0

Отлично, спасибо! Я использовал идею вложенного ajax. Сегодня я отправлю свое полное решение. – Glen226

+0

Надеюсь, это помогло! Не забудьте отметить ответ как правильный, если он действительно вам помог, и удачи с кодом! – CrackAttack