首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >实现递归ajax调用并在一个条件下停止它

实现递归ajax调用并在一个条件下停止它
EN

Stack Overflow用户
提问于 2014-08-01 10:27:20
回答 2查看 1.3K关注 0票数 1

搜索和尝试已经有几个小时了,但是作为ajax新手,我一直没有得到我想要的东西。1.我有一个页面从db中获取当前日期的数据,因此我使用一些setTimeOut()10 seconds递归调用ajax函数,以显示更新后的db复读器。2.在这里,我失败了。我有日期选择器,所以一旦用户从jquery选择器中选择过去的日期,我就应该停止当前的ajax进程并获取特定日期的数据,并且我不希望它递归调用,因为过去的数据从未改变过。

递归事物的代码

代码语言:javascript
运行
复制
function makeCall(selectedDate) {
  $(document).ready(function() {
    $("#divtable").hide();
    $.get('getdataservlet',{ 'selectedDate': selectedDate },function(responseJson) {
      if (responseJson!=null) {
        $("#datatable").find("tr:gt(0)").remove();
        var table1 = $("#datatable");
        $.each(responseJson, function(key,value) { 
          var rowNew = $("<tr><td></td><td></td><td></td><td></td><td></td></tr>");
          rowNew.children().eq(0).text(value['first']); 
          rowNew.children().eq(1).text(value['two']); 
          rowNew.children().eq(2).text(value['three']); 
          rowNew.children().eq(3).text(value['four']); 
          rowNew.children().eq(4).text(value['five']); 
          rowNew.appendTo(table1);
        });
      }
      setTimeout(makeCall, 10000,selectedDate);
    });
    $("#divtable").show();
  });
}

makeCall(currentDate());

这是第一次调用makeCall(currentDate()),它每10秒继续使用setTimeout()进行递归。

Jquery 的代码

代码语言:javascript
运行
复制
$(function() {
  $("#dateinput").datepicker({
    onSelect: function(date) {
    // Here I want to make single ajax call while
    // stopping the current recursive call.
    // The recursive should continue again when user selects current date.
    },
    showOn: "button",
    buttonImage: "cal.gif",
    buttonImageOnly: true,
    dateFormat: "yy-mm-dd"
  });
});

有人能帮我一下吗?很抱歉,尽管多次尝试,我还是无法正确地格式化问题中的代码。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-01 10:44:55

只需创建一个布尔标志,以指示所选的currentDate:

代码语言:javascript
运行
复制
var someFlag = true,
    timeout = null;
function makeCall(selectedDate) {
  if (someFlag == true) {
    $("#divtable").hide();
    $.get('getdataservlet',{ 'selectedDate': selectedDate },function(responseJson) {
      if ((!isCurrentDate(selected) || someFlag == true) && responseJson!=null) {
        $("#datatable").find("tr:gt(0)").remove();
        var table1 = $("#datatable");
        $.each(responseJson, function(key,value) { 
          var rowNew = $("<tr><td></td><td></td><td></td><td></td><td></td></tr>");
          rowNew.children().eq(0).text(value['first']); 
          rowNew.children().eq(1).text(value['two']); 
          rowNew.children().eq(2).text(value['three']); 
          rowNew.children().eq(3).text(value['four']); 
          rowNew.children().eq(4).text(value['five']); 
          rowNew.appendTo(table1);
        });
      }
      timeout = setTimeout(makeCall, 10000, selectedDate);
    });
    $("#divtable").show();
  }
}

$(document).ready(function() {
  makeCall(currentDate());
});

此外,实现函数isCurrentDate,如果提供日期为currentDate,则返回布尔值。

代码语言:javascript
运行
复制
$(function() {
  $("#dateinput").datepicker({
    onSelect: function(date) {
       clearTimeout(timeout);
       if (isCurrentDate(date)) {
           someFlag = true;
           makeCall(date);
       } else {
           someFlag = false;
       }
    },
    showOn: "button",
    buttonImage: "cal.gif",
    buttonImageOnly: true,
    dateFormat: "yy-mm-dd"
  });
});
票数 1
EN

Stack Overflow用户

发布于 2014-08-01 10:53:45

如果所选日期小于今天的日期,则需要在计时器上调用clearTimeout

代码语言:javascript
运行
复制
var timer;
function makeCall(selectedDate) {
  $.get(...
  ....
  if (selectedDate < new Date() && timer) {
    // If a timer is already running and the selected date is less than today, stop it
    clearTimeout(timer);  
  } else {
    // Start a timer
    timer = setTimeout(makeCall, 10000, selectedDate);
  }

并在document.ready中调用此函数,并在选择新日期时调用该函数

演示使用情况的简单小提琴 (在文本框中输入一个数字以停止循环)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25078173

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档