javascript - 将 JavaScript 计时器函数转换为使用异步调用

标签 javascript asynchronous

我有这个 javascript 函数,它使用计时器每 2 秒调用一个 ajax 文件。
但是,我看到该数据是在之前的数据执行完成之前发送到ajax文件的。也就是说,它在大约 10 秒内发送整个列表,而处理数据大约需要 120 秒。

有没有办法,只有当前一个数据节点完成处理后,我才能发送下一个数据节点? cb.call(this) 用于调用函数,当此计时器完成时,
querylimit 是一个响应变量,如果为 true,则退出该函数。

var i = 0;
var querylimit=false;
function refreshTimer(list,cb,i){
    if (!(i >= 0)) { i= 0; }
    setTimeout((function(chunk){
        i++;
        return function(){
            if (querylimit) { cb.call(this); }
            if(i <= list.length && !querylimit){
                refreshTimer(list,cb,i);
                refreshClients(chunk);
            }
            if(i == list.length+1) { cb.call(this); }
            if(i > list.length+1 || querylimit) { return null; }
        }
    }) (list[i]), 2000);
}

问候
尼基尔·古普塔

最佳答案

我通常会设置所谓的“级联”,这是 window.setTimeout(...) 调用的链式 react ,而不是单个 window.setInterval(.. .) 打电话。

而不是:

function requestAjaxData() {
    // prep ajax / call onAjaxDataReceived on success.
}
function onAjaxDataReceived() {
    // process data
}
window.setInterval(requestAjaxData, 2000);

我愿意:

function requestAjaxData() {
    // prep ajax / call onAjaxDataReceived on success.
}
function onAjaxDataReceived() {
    // process data

    // continue the cascade
    requestAjaxDataCascade();
}
function requestAjaxDataCascade() {
    window.setTimeout(requestAjaxData, 2000);
}
requestAjaxDataCascade();

关于javascript - 将 JavaScript 计时器函数转换为使用异步调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5209853/

相关文章:

javascript - fancybox 防止在窗口外部关闭点击

javascript - AngularJS 获取范围内的选定项

尝试同时写入 websocket session 时,Tomcat 抛出 "The remote endpoint was in state [BINARY_FULL_WRITING] ..."

javascript - RxJS异步循环

ios - 如何在 ios 中异步读取 Documents 目录中的文件

javascript - 无需登录即可使用 GAPI 获取 Google Analytics 数据

javascript - 在 jQuery 回调中获取父对象

javascript - 使用 js 更改输入 slider 的颜色渐变?

javascript - Parse.com 循环内的 Javascript 异步调用

c# - 如何异步调用静态方法