将jQuery setInterval时序转换为递归setTimeout时序

时间:2018-04-30 01:54:03

标签: php jquery ajax

我在这里有一个队列管理系统的代码片段,它根据允许在屏幕上显示的窗口数量动态地从数据库中获取数据。

    var elementArray;

    function fetchPayment() {
        elementArray = new Array();
        $('.win_id').each(function() {
            // here's the moneyshot
            elementArray.push(this);
        });
        doAjax(0);
    }

    function doAjax(param) {
        if (typeof elementArray[param] === 'undefined') {
            var win_id = 0;
        } else {
            var win_id = elementArray[param].value;
        }
        $.ajax({
            type: "GET",
            dataType: 'json',
            //                async: false,
            url: "<?php echo base_url();?>queue/getCurrentTransaction/" + win_id,
            success: function(data) {
                param++;
                if (param <= elementArray.length) {
                    $('.names-' + win_id).empty();
                    $('.names-' + win_id).append("<div class='pname'>" + data.customer_name + '<li>' + data.ref_code + '</li></div>');
                    doAjax(param);

                } else {
                    console.log("!");
                }

            },
            error: function(data) {
                param++;
                $('.names-' + win_id).empty();
                $('.names-' + win_id).append("<div class='pname'><li></li></div>");
                doAjax(param);
            }
        });
    }

然而,这是有效的,它太过CPU密集而且无可否认是一种糟糕的方法,我重构了我的其他功能,使它们像这样:

    (function fetchNewServiceConnection() {
        setTimeout(function() {
            $.ajax({
                type: "GET",
                dataType: 'json',
                url: "<?php echo base_url();?>queue/getCurrentTransaction/" + 100,
                success: function(data) {
                    $('.c_name').empty();
                    $('.c_name').append(data.customer_name + '<li>' + data.ref_code + '</li>');
                    fetchNewServiceConnection()
                },
                error: function(data) {
                    $('.c_name').empty();
                    $('.c_name').append('<li></li>');
                    fetchNewServiceConnection()
                }
            });
        }, 500);
    })();

这样做的速度要快得多。问题是上面的代码,我如何将其转换为下面的代码片段?

1 个答案:

答案 0 :(得分:2)

在你的

里面
function doAjax(param) {

    if (typeof elementArray[param] === 'undefined') {
        var win_id = 0;
    } else {
        var win_id = elementArray[param].value;
    }
    $.ajax({
        type: "GET",
    // etc....

}

您在两个地方doAjax(param);,一个用于success:,另一个用于error:

  

使用以下内容替换 doAjax(param);

     

<强> setTimeout(doAjax.bind(null, param), 500);

<强> 注意:
我不确定,但看起来您正在尝试 "real time data" ,所以我的建议是查看 WebSockets https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API),托管您自己的,或最终提供商,例如Pusher.com(https://pusher.com/