setInterval回调的AJAX成功回调中如何让指定代码块仅执行一次
问题根因
- 控制执行次数的变量
displayRow更新逻辑错误:你写的displayRow + 1仅执行了加法计算,没有将结果赋值回displayRow变量,所以displayRow始终为0,只要遍历到符合条件的拍卖项就会触发表格更新,无法实现单次请求仅执行一次的需求。 - 额外注意:如果请求参数里的
last_timestamp没有在每次拿到新数据后更新为最新的记录时间,后端会重复返回历史记录,也会导致表格重复插入相同行。
修正方案
只需要调整两处代码即可:
- 修正
displayRow的赋值逻辑,或者在执行完表格更新后直接跳出遍历循环 - 处理完响应数据后更新
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
相关产品推荐
相关产品推荐

