在JavaScript中进行同步API调用

时间:2019-05-28 03:34:56

标签: javascript jquery ajax

我在javascript中有一个调用GET api的方法

var PC;
    function GetDetails() {
    $.ajax({
        type: "GET",
        url: Myurl,
        success: function (response) {
            //console.log(response);
            PC= response;
        }
    });
}

我在名为PC的变量中设置响应,在另一种方法中,我将此称为

function PerformTask()
{
GetDetails();
console.log(PC);
}

在GetDetails方法中console.log(response);可以,但是在PerformTask()console.log(PC)中未定义

据我了解,这是一个异步呼叫,尚未设置PC

我如何使其与下一条语句同步?因为我需要PC的价值才能执行下一组语句

我也尝试了api调用

fetch(Myurl)
        .then(resp => resp.json())
          .then(resp=> setting variable here) ;

但是它不起作用(可以异步运行)

更新1

return new Promise(function (resolve, reject) {
    $.ajax({
        type: "GET",
        url: Myurl,
        success: function (response) {
            //console.log(response);;
            resolve(response);
        },
        error: function (err) {
            reject(err);
        }
    });
});

在Performtask()中

GetPropertyDetails()
    .then(function (data) {
        PC= data;
    });
console.log(PC);

但是PC仍未定义

2 个答案:

答案 0 :(得分:2)

成功后,您可以调用另一个需要响应的方法。由于调用为ASYNC,因此该函数将无法获得响应。

var PC;
function GetDetails() {
    $.ajax({
        type: "GET",
        url: Myurl,
        success: function (response) {
            //console.log(response);
            PC= response;
            // Your next function 
            PerformTask(PC);
        }
    });
}

function PerformTask(pc)
{
    GetDetails();
    console.log(pc);
}

还有另一种方法,但我认为这是不好的方法

$.ajax({
            type: "GET",
            url: Myurl,
            async:false,
            success: function (response) {
                //console.log(response);
                PC= response;
                // Your next function 
                PerformTask(PC);
            }
        });

使用promise =>您可以使用asyncawait

function asyncCall() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve(5)
    }, 2000)
  });
}

(async function() {
  const result = await asyncCall();
  if (result) console.log(result)
})()

希望这对您有所帮助。

答案 1 :(得分:0)

更好的选择是在ajax成功内部调用PerformTask()函数,并将结果传递给PerformTask函数。 即

   function GetDetails() {
    $.ajax({
        type: "GET",
        url: Myurl,
        success: function (response) {
            //console.log(response);
            PerformTask(response);
        }
    });
}