You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

setInterval回调的AJAX成功回调中如何让指定代码块仅执行一次

问题根因

  • 控制执行次数的变量displayRow更新逻辑错误:你写的displayRow + 1仅执行了加法计算,没有将结果赋值回displayRow变量,所以displayRow始终为0,只要遍历到符合条件的拍卖项就会触发表格更新,无法实现单次请求仅执行一次的需求。
  • 额外注意:如果请求参数里的last_timestamp没有在每次拿到新数据后更新为最新的记录时间,后端会重复返回历史记录,也会导致表格重复插入相同行。

修正方案

只需要调整两处代码即可:

  1. 修正displayRow的赋值逻辑,或者在执行完表格更新后直接跳出遍历循环
  2. 处理完响应数据后更新last_timestamp为最新值,避免拉取重复数据

修正后的完整代码如下:

var running = false;
var _interval = 1;
var last_timestamp = 0; // 请确保你已经初始化了这个变量

if (_interval) {
  setInterval(function() {
    check_live_records();
  }, _interval * 1000);
}

function check_live_records() {
  if (typeof running === 'boolean' && running === true) {
    return;
  }

  running = true;
  var displayRow = 0;

  $.ajax({
      url: ajaxUrl,
      type: 'POST',
      encoding: 'UTF-8',
      dataType: 'JSON',
      data: {
        action: 'get_live_records',
        last_timestamp: last_timestamp
      },
      success: function(response) {
        if (response != null) {
          $.each(response.auctions, function(key, value) {
              if (key > 0) {
                var tableRow = $('tr#auction-' + key);
                if (tableRow.length) {
                  // 更新当前价格
                  tableRow.find('.column-current_price').html(value.wua_curent_bid);

                  if (value.table_row && displayRow == 0) {
                    // update bidding table 仅执行一次
                    var logs = value.table_row;
                    var _row = '<tr>' +
                      '<td>' + logs.user_display_name + '</td>' +
                      '<td>' + logs.currency_symbol + logs.current_bid + '</td>' +
                      '<td>' + logs.currency_symbol + logs.max_bid + '</td>' +
                      '<td>' + logs.date + '</td>' +
                      '</tr>';
                    tableRow.find('table#auction_bidding_table_' + key + ' tbody').prepend(_row);
                    displayRow += 1; // 修正赋值逻辑
                    // 可选:直接跳出each循环,不需要继续遍历剩下的项
                    // return false;
                  }
                }
              }
          });
          // 更新最新时间戳,下次请求只拉取该时间之后的新记录
          last_timestamp = response.new_last_timestamp; // 这里替换成你后端返回的最新时间戳对应字段名
        }
        running = false;
      },
      error: function() {
        running = false;
      }
  });
}

内容的提问来源于stack exchange,提问作者Muzammil Hussain

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 19:15:03