首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Javascript:多个事件,一个ajax请求

Javascript:多个事件,一个ajax请求
EN

Stack Overflow用户
提问于 2013-05-15 00:46:48
回答 3查看 1K关注 0票数 0

我对JS有些陌生,我正在努力想出在我正在开发的应用程序中设计某些异步交互的最佳方法。

我有一个与API支持的实时数据相关的记录列表。我向用户显示了这些记录的列表,用户可以选择他们想要查看更多信息的特定记录。我通过ajax调用从API加载这个额外的数据。

为了使这成为一个更真实的例子,我们假设我所拥有的是一个股票列表。我有每只股票的名字和昨天的收盘价。在每个股票名称旁边都有一个复选框,如果用户选中这个复选框,它就会在图表上显示过去一年股票的历史价格。

当用户以这种方式选择一只股票时,行为很简单。我发送了一个API请求来获取一只股票的历史数据,并将其绘制在图形上。

然而,用户可能会一次选择一堆股票,或者快速选择。我不想连续发出10个、20个或50个请求,我想对10个、20个或50个股票历史记录发出一个请求。

假设我的应用程序有一个事件侦听器,它在选中复选框时查找股票历史记录,如下所示:

代码语言:javascript
复制
$('input.stock_toggle').change( function(event){
  var symbol = $(this).data('symbol');
  lookupStockHistory(symbol);
});

我如何定义一个lookupStockHistory函数,或者其他类型的事件侦听器等,让它等待一秒钟,并将传入的所有事件集中在一起发送一个请求,而不是连续多次触发?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-05-15 01:02:30

代码语言:javascript
复制
var lookupStockHistory = (function () {
"use strict";
var qeue = [], timeoutHandler = null, timeoutTime = 1000,
    sendCall = function () {
        //process qeue array and trigger ajax call
        //and clean qeue
        qeue = [];
    },
    add = function (symbol) {
        if (timeoutHandler) {
            clearTimeout(timeoutHandler);
            timeoutHandler = null;
        }
        qeue.push(symbol);
        timeoutHandler = setTimeout(sendCall, timeoutTime);
    };
return add;}());

要触发,只需调用lookupStockHistory(symbol)即可。这会将符号收集到数组中,该数组将在上次调用后的1秒后进行处理

票数 2
EN

Stack Overflow用户

发布于 2013-05-15 01:09:38

您可以使用将请求推入带有名称空间的“全局变量”,然后使用setTimeout延迟AJAX调用(可能需要一两秒钟?)。

setTimeout将调用一个从“全局变量”获取请求的函数,清空该变量,然后构造您的请求。随后对setTimeout函数的任何调用都会看到“全局变量”为空,并且不会构造未来的AJAX请求。

在下面的示例中,我还删除了当前的挂起超时,因为已经启动了一个新的超时。

下面是一个使用jQuery进行选择和事件捕获的伪代码示例:

代码语言:javascript
复制
var DELAY_FOR_INPUT = 2000; // 2 seconds

var g_MyDataToRequest = [];
var g_currentAJAXCallTimeout = null;

function _callAPI = new function() {
   g_currentAJAXCallTimeout = null;
   var dataToGet = g_MyDataToRequest;
   g_MyDataToRequest = []; // clear out global request cache

   // TODO: Loop over dataToGet and construct AJAX request
   // TODO: Perform AJAX call...
}

$('.myCheckbox').click(function() {
   var myRequest = $(this).attr("ID"); // or Val(), or whatever you'd like to track your item
   g_MyDataToRequest.push( myRequest );

   // If have a pending request, kill it
   if (g_currentAJAXCallTimeout != null) {
     clearTimeout(g_currentAJAXCallTimeout);
     g_currentAJAXCallTimeout = null;
   }

   g_currentAJAXCallTimeout = setTimeout( _callAPI, DELAY_FOR_INPUT );
});

如上所述,这是伪代码,可能不能很好地工作,但它应该会让您开始工作。

票数 1
EN

Stack Overflow用户

发布于 2013-05-15 01:02:50

您可以实现一个计时器,并在第一次单击或更改事件时启动它。对于每个额外的单击或更改事件,您都可以重置计时器。此外,对于每个事件,您可以相应地向数组添加或移除符号值。一旦计时器超时,您将作为逗号分隔的字符串加入数组,并通过ajax将其发送回来并获得JSON结果。

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

https://stackoverflow.com/questions/16548622

复制
相关文章

相似问题

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