递归调用ajax函数,直到第一个ajax函数完成

时间:2017-09-06 10:26:55

标签: javascript jquery ajax parallel-processing

我有一个python文件,它将结果附加到日志文件中,我需要在UI中同步打印此日志。

以下是我的代码

var flag = 0;
function write_log_in_file(){
  var settings = {
    "async": true,
    "crossDomain": true,
    "url": "http://localhost/build5/builds/test.py",
    "method": "POST",
    "headers": {
      "cache-control": "no-cache"
    }
  }
  $.ajax(settings).done(function (response) {
    flag =1;
    console.log(response);
  });
};

function get_log_from_file(){
  var settings = {
    "async": true,
    "crossDomain": true,
    "url": "http://localhost/build5/builds/build.log",
    "method": "GET",
    "headers": {
      "cache-control": "no-cache"
    }
  }
  $.ajax(settings).done(function (response) {
    console.log(response);
  });
};

//Write build log in build.log file
write_log_in_file();

//Get log until python call is completed 
while(!flag){
  get_log_from_file();
}

这里,我使用了flag变量,在我的第一个ajax调用完成后设置为1。在那之前,我的第二个ajax调用是递归调用的。

由于我使用了while,因此标志变量永远不会变为1,而变为无限循环。

还有其他方法,我可以递归调用我的ajax函数,而其他ajax函数完成了吗?

2 个答案:

答案 0 :(得分:1)

$.ajax会返回您可以链接的承诺。

function write_log_in_file(){
  var settings = {
    "async": true,
    "crossDomain": true,
    "url": "http://localhost/build5/builds/test.py",
    "method": "POST",
    "headers": {
      "cache-control": "no-cache"
    }
  }
  return $.ajax(settings) // return a promise
};

function get_log_from_file(){
  var settings = {
    "async": true,
    "crossDomain": true,
    "url": "http://localhost/build5/builds/build.log",
    "method": "GET",
    "headers": {
      "cache-control": "no-cache"
    }
  }
  return $.ajax(settings) // return a promise
};

//Write build log in build.log file
write_log_in_file()
  .then(function(result) {
    console.log(result) // log write result

    return get_log_from_file() // launch read
  })
  .then(function(result) {
    console.log(result) // log read result
  })
  .catch(function(error) {
    console.error(error);
  });

答案 1 :(得分:0)

Yury的回答是使用承诺的好方法(你应该研究一下)

但是代码的问题在于JQuery's ajax中没有记录的 .done 方法。您必须使用 .success

{{1}}