我目前依赖简单的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);
}
}
});
}
答案 0 :(得分:2)
如果返回的集合为空,而不是使用setTimeout
,请在函数中包装请求,并在请求的success
回调中调用相同的函数。
这会阻止您一次向API发送多个请求,并且一旦您收到满意的回复,也会立即终止。
(简而言之,您使用递归而不是显式循环。)