0

在该beforeSend部分中,我添加了一个setTimeout. 如果 ajax 花费超过 20 秒,则会出现超时消息。如果 ajax 在 20 秒前达到成功,setTimeout它仍在运行并出现超时消息。

如果 ajax 在不到 20 秒内完成,如何防止出现超时消息?

形式

<?= $form->field($relasi, 'npsn')->textInput(['class' => 'form-control', 'id' => 'npsn', 'onkeyup' => 'sendFirstCategory(this.value)', 'autocomplete' => 'off'])->label(false); ?>

JavaScript

function sendFirstCategory(npsn)
{
    var test = npsn;
    var timeoutvar = null;

    $.ajax({
        url: '<?php echo \Yii::$app->getUrlManager()->createUrl('keranjang/isi-data-ajax') ?>',
        type: 'POST',
        data: { test: test },
        beforeSend:function()
        {  
            $('#hokya').show();
            $('#hokya').html('<img src="../img/Preloader_1.gif" alt="Loading..." />');

            var a = "";

            $('form [id=nm_sekolah]').val(a);
            $('form [id=email]').val(a);
            $('form [id=telp]').val(a);
            $('form [id=alamat]').val(a);
            $('form [id=penanggung_jawab]').val(a);

            timeoutvar = setTimeout(function() { 
                $("#hokya").hide(); 
                $('#login-modal').modal('show');
                $('form [id=nm_sekolah]').val(a);
                $('form [id=email]').val(a);
                $('form [id=telp]').val(a);
                $('form [id=alamat]').val(a);
                $('form [id=penanggung_jawab]').val(a);
            }, 20000);
        },
        success: function(data)
        {

            clearTimeout(timeoutvar);
            var o = $.parseJSON(data);

            $.each(o, function(key, value){
                $('form [id=' + key + ']').val(value);
            });

            $('#hokya').hide();
        }
   });
}
4

2 回答 2

0

我想你可以写一个错误回调函数,并检查状态是否超时。当然,你也需要设置 timeout:20。

来自 jquery 的 ajax api:

error 类型:Function(jqXHR jqXHR, String textStatus, String errorThrown) 请求失败时调用的函数。该函数接收三个参数:jqXHR(在 jQuery 1.4.x 中,XMLHttpRequest)对象,一个描述发生的错误类型的字符串和一个可选的异常对象(如果发生)。第二个参数(除了 null)的可能值是“timeout”、“error”、“abort”和“parsererror”。发生 HTTP 错误时,errorThrown 会接收 HTTP 状态的文本部分,例如“未找到”或“内部服务器错误”。从 jQuery 1.5 开始,错误设置可以接受一个函数数组。每个函数都会被依次调用。注意:跨域脚本和跨域 JSONP 请求不调用此处理程序。这是一个 Ajax 事件。

function sendFirstCategory(npsn){
var test = npsn;
$.ajax({
    url: '<?php echo \Yii::$app->getUrlManager()->createUrl('keranjang/isi-data-ajax') ?>',
    type: 'POST',
    data: { test: test },
    beforeSend:function()
    {  
        $('#hokya').show();
        $('#hokya').html('<img src="../img/Preloader_1.gif" alt="Loading..." />');

        var a = "";

        $('form [id=nm_sekolah]').val(a);
        $('form [id=email]').val(a);
        $('form [id=telp]').val(a);
        $('form [id=alamat]').val(a);
        $('form [id=penanggung_jawab]').val(a);
    },
    timeout:200000,
    success: function(data)
    {
        var o = $.parseJSON(data);

        $.each(o, function(key, value){
            $('form [id=' + key + ']').val(value);
        });

        $('#hokya').hide();
    },
    error:function(jqXHR,textStatus) 
    {
        if (textStatus=='timeout') {
            var a = "";
            $("#hokya").hide(); 
            $('#login-modal').modal('show');
            $('form [id=nm_sekolah]').val(a);
            $('form [id=email]').val(a);
            $('form [id=telp]').val(a);
            $('form [id=alamat]').val(a);
            $('form [id=penanggung_jawab]').val(a);
        }
    }

}); }

于 2016-12-08T02:51:37.723 回答
0

您的timeout = setTimeout(...)语句将超时 id 分配给名为 的全局变量timeout。您clearTimeout(timeoutvar);使用不同的变量timeoutvar.

更改timeouttimeoutvar

于 2016-12-08T03:12:31.507 回答