运行ajax请求,直到返回结果

时间:2018-02-03 16:18:27

标签: javascript jquery ajax

我目前依赖简单的ajax调用从查询服务api中获取一些数据。遗憾的是,它不是最强大的api,有时可以返回空结果集。因此,我想重试ajax调用直到resultSet.length > 0

如果我找到结果,我可以使用setTimeOut并打破循环,但它似乎是一个不优雅的解决方案,特别是因为完成时间在1到6之间。我目前有以下内容,但它似乎并没有在需要时打破循环,并且仍然不够优雅。任何帮助将不胜感激!

var resultSet = 0;

function fetchQueryData(query, time, iter) {
  (function myLoop(i){
    if (i == iter) {
      fetchData(resultSet, dataset, query);
    } else {
      setTimeout(function(){
       if (resultSet == 0) {
         fetchData(resultSet, dataset, query); 
       }
       if (--i) myLoop(i);
     }, time)
    }
  })(iter);
}

fetchQueryData('select * from table', 6000, 5);

function fetchData(resultSet, dataset, query) {
  var dataString = 'query=' + encodeURIComponent(query);

  $.ajax({
    type : "POST",
    data: dataString,
    url : "/queryapi",
    success: function(json) {
      var data = [];
      var schema = json.data.schema;
      var rows = json.data.rows;

      if (typeof schema != 'undefined') {
         resultSet = 1;
         for (var i = 0; i < rows.length; i++) {
           var obj = {};
           for (var j = 0; j < schema.length; j++) {
             obj[schema[j]['name']] = rows[i][j];
           }
           data.push(obj);
         }
      }  
  });
}

1 个答案:

答案 0 :(得分:2)

如果返回的集合为空,而不是使用setTimeout,请在函数中包装请求,并在请求的success回调中调用相同的函数

这会阻止您一次向API发送多个请求,并且一旦您收到满意的回复,也会立即终止。

(简而言之,您使用递归而不是显式循环。)