【问题标题】:Ajax call to complete success, before actually completing the call?Ajax 调用完成成功,在实际完成调用之前?
【发布时间】:2012-10-09 11:17:00
【问题描述】:

我正在尝试找出一个 ajax 调用...我需要调用来保持并完成加载 HTML 内容,然后再重新开始(它由 keyup 事件触发)...否则返回的 HTML 实际上是多次加载。在我的例子中,ajax 调用返回 HTML,然后执行一个 JS 函数。但是当它被多次加载时,JS函数被执行了两次=错误。

这是我的代码(警告框仅用于帮助...):

$(document).ready(function() {

   var isProcessing = false;

   $('#productSearchInput').keyup(function() {

   var productSearchInput = $(this).val();
   var dataString = 'searchInput='+ productSearchInput;
   var script_url = '../ajax/service-search.php';

    if(productSearchInput.length > 3 && isProcessing === false) {
        $.ajax({
        type: 'GET',
        url: script_url,
        data: dataString,
        beforeSend:     
            function() {    
            isProcessing = true;
                            alert('Processing input: ' + productSearchInput;
            },
        success:
            function(server_response)   {
            $('#searchresultdata').html(server_response).show('fast', function() { alert('Currently processing...');  } );  
            },
        error:
            function() {
            alert('ajax call failed...');
            },
        complete: 
            function() {
            isProcessing = false;
                            alert('Processing done');
            }
        });

    }

  return false;
  });
});

问题是,“处理完成”警报出现在“等待处理”警报之前......然后在“处理完成”警报显示之后,“等待处理”警报显示。

在完成调用和设置 isProcessing = false;...

之前,我需要显示我的 HTML server_response

我如何做到这一点?

【问题讨论】:

    标签: javascript jquery ajax


    【解决方案1】:

    这是正常行为。使用show 方法需要一些动画时间,所以在完成后调用回调。为什么不把你的代码简化成这样:

    $.ajax({
        type: "GET",
        url: script_url,
        data: dataString,
        beforeSend: function() {    
            isProcessing = true;
            alert('Processing input: ' + productSearchInput);
            },
        success: function(server_response)   {
            alert('Wait for processing...');
            $('#searchresultdata').html(server_response).show('fast', function() { 
                alert('Processing done');
                isProcessing = false;
            });                    
        },
        error: function() {
            alert('ajax call failed...');
        }
    });
    

    【讨论】:

    • 这就是我开始的地方;) 我需要调用来等待 HTML 加载的原因是有时我正在扫描条形码。当我扫描条形码时,HTML 在再次消失之前永远不会被加载。然后我可以点击一个随机键,因为 ajax 调用是由 keyup 触发的 - 然后读取我扫描的数字。我尝试将使用 ENTER 的条形码扫描仪设置为终止符,但这一切都发生得太快了 - 因为尚未加载 HTML。
    • 也许您可以在 jsfiddle 上提供更详细的信息或示例,以便用户可以重现您的问题?也许xhr.abort()setTimeout 可以帮助避免过多的ajax 调用/内容重新加载?
    • 如果我举一个简单的例子,一切都很好...我从中加载 HTML 的 .php,当然包括 mySQL 查询。我很确定我的 ajax 调用比我的 PHP 文件中的 mySQL 查询完成得更快,这会导致 ajax 调用在返回任何 HTML 之前重新开始......
    【解决方案2】:

    为什么不使用jQuery.Deferred 对象,而不是isProcessing

    请检查这种情况下的代码(类似这样):

         var isProcessing = $.Deferred();
    
         $.ajax({
            type: "GET",
            url: script_url,
            data: dataString,
            beforeSend: function() {    
                alert('Processing input: ' + productSearchInput);
            },
            success: function(server_response) {
                alert('Wait for processing...');
                $('#searchresultdata').html(server_response).show('fast', isProcessing.resolve);                    
            },
            error: function() {
                alert('ajax call failed...');
            }
        });
        $.when(isProcessing).then(function(){alert('Processing done');});
    

    【讨论】:

    • 没有改变任何东西...我已经更新了我的脚本以包含更多语句...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-06
    • 1970-01-01
    相关资源
    最近更新 更多