bugfix> javascript > 投稿

私はrestとjsを使用してSharePointオンラインでいくつかのデータを取得することができ、それも私の目的を解決していますが、その後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 件
  • $.Deferred() を使用する  このようなシナリオでは、機能の連鎖に役立ち、 then を使用できます  オペレーター

    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); を使用して成功したデータを返します

  • $.ajax  すでに約束を返します。それは必ずしもPromise/A +に準拠しているわけではないjQueryの約束です(これはjQuery 3で修正されました)が、それはそれから await で処理できるためです。  当然。 $.ajax  promiseを返すためにコールバックを必要としません:

    async function GetUserProperties(user) {
      ...
      let result = await $.ajax({
        method: "GET",
        headers: {
          "Accept": "application/json; odata=verbose"
        },
        url: url
      });
      ...
    }
    
    

あなたの答え