Как использовать async / await для получения данных через sharepoint онлайн? - PullRequest
0 голосов
/ 02 июля 2018

Я могу получить некоторые данные в SharePoint онлайн, используя rest и js, и это также решает мою задачу, но затем я использую async: false, чтобы сделать его синхронным, что, я думаю, не рекомендуется. поэтому, когда я искал альтернативное решение, я узнал о async/await. Можно ли использовать async/await в приведенном ниже коде? Пожалуйста, предложите.

function GetUserProperties(user) {
  //getting user properties for a user
  var url = _spPageContextInfo.webAbsoluteUrl + "/_api/SP.UserProfiles.PeopleManager/GetPropertiesFor(accountName=@v)?@v=%27i%3A0%23.f|membership|" + user + "%27";
  $.ajax({
    method: "GET",
    headers: {
      "Accept": "application/json; odata=verbose"
    },
    url: url,
    success: function(data) {
      successUsersInfo(data);
    },
    error: function(data1) {
      alert("ERROR");
    }
  });
}

function successUsersInfo(data) {
  // logic to call data
  secondFunction(); //then i am calling another function
}

function secondFunction() {
  $.ajax({
    method: "GET",
    headers: {
      "Accept": "application/json; odata=verbose"
    },
    url: url,
    async: false,
    success: function(data) {
      //logic to get data
    },
    error: function(data1) {
      alert("ERROR");
    }
  });
  //now my third function depends on the values of second data
  //and i am using  async:false, to make it synchronous
  thirdFunction();
}

function thirdFunction() {
  //logic to use second function data since my third function is dependent on second function
}

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

$.ajax уже возвращает обещание. Это обещание jQuery, которое не обязательно соответствует Promise / A + (это было исправлено в jQuery 3), но его можно использовать, поэтому оно может быть обработано await естественным образом. $.ajax не требуется никаких обратных вызовов для возврата обещания:

async function GetUserProperties(user) {
  ...
  let result = await $.ajax({
    method: "GET",
    headers: {
      "Accept": "application/json; odata=verbose"
    },
    url: url
  });
  ...
}
0 голосов
/ 02 июля 2018

Используйте $.Deferred() в таких senarios, которые помогут связать функции в цепочку, и вы сможете использовать then operator

function GetUserProperties(user) {
  var deferred = $.Deferred();
  var url = _spPageContextInfo.webAbsoluteUrl + "/_api/SP.UserProfiles.PeopleManager/GetPropertiesFor(accountName=@v)?@v=%27i%3A0%23.f|membership|" + user + "%27";
  $.ajax({
    method: "GET",
    headers: {
      "Accept": "application/json; odata=verbose"
    },
    url: url,
    success: function (data) {
     deferred.resolve(data);
    },
    error: function (data1) {
      alert("ERROR");
    }
  });
  return deferred.promise();
}

function secondFunction() {
  var deferred = $.Deferred();
  $.ajax({
    method: "GET",
    headers: {
      "Accept": "application/json; odata=verbose"
    },
    url: url,
    async: false,
    success: function (data) {
      deferred.resolve(data);
    },
    error: function (data1) {
      alert("ERROR");
    }
  });
  return deferred.promise();

}

function thirdFunction() {
  var deferred = $.Deferred();
  $.ajax({
    method: "GET",
    headers: {
      "Accept": "application/json; odata=verbose"
    },
    url: url,
    async: false,
    success: function (data) {
      deferred.resolve(data);
    },
    error: function (data1) {
      alert("ERROR");
    }
  });
  return deferred.promise();
}

Теперь вы можете вызывать эти функции следующим образом

   GetUserProperties("uerid")
  .then(function (secondFuncData)
   {
    secondFunction(secondFuncData)
      .then(function (thirdFuncData)
      {
        thirdFuncData(thirdFuncData)
          .then(function (finalData) 
            {
              console.log(finalData);
            })
      })
  })

Функция начинается с var deferred = $.Deferred(); и заканчивается return deferred.promise();. И верните данные успешно, используя deferred.resolve(data);

...