【问题标题】:jQuery - to wait until function returns and then continuejQuery - 等到函数返回然后继续
【发布时间】:2013-10-04 15:25:00
【问题描述】:

当我更新到 1.10.2 版本时,我开始遇到 jQuery 的一些问题。

我一直在寻找答案,但似乎没有一种方法有效,我可能做错了什么。非常感谢您的帮助。

主要问题是点击事件不等待 validateAjax 的结果,只是说 validateBaan 未定义。我已经检查了 validateAjax 函数并且输出的值是 true 或 false,但我猜到那时点击事件已经继续。我希望点击事件等待 validateAjax 结果然后继续。

点击事件:

$('#log-in').on('click', function() {

    // triggers validateAjax
    var validateBaan = validateAjax('fieldId', 'worker');

    // every time I log it says undefined, even though it gets value 
    // (true or false), but too late
    // console.log(validateBaan);

    // this function works
    var validateShift = checkInput({
        shift: {
            field: 'btn-group',
            hasClass: 'active',
            error: 'shifterror'
        }
    });
    // when both are true take some action
    if (validateBaan && validateShift) {
        ...
    }
});

这里是 validateAjax 函数:

function validateAjax(fieldId, query) {

   var output;

   // field value
   var fieldValue = $('#' + fieldId).val();

   // sending ajax request
   var ajaxQuery = $.ajax({
     type: "GET",
     url: "update.php",
     data: 'checkup=checkup&baan=' + fieldValue
    });

   // based on the response, takes action
   ajaxQuery.done(function(response) {
      if (response.error) {
          output = false;
          $('.error-' + fieldId).html(response.error);
       } else if (response.product) {
          $.cookie('tab_name', response.product);
          output = true;
       } else {
          output = true;
       }
       return output;
   });
}

我曾尝试使用 jQuery when/then,但我没有设法让它工作。

我在使用旧 jQuery 版本时从未遇到过这样的问题,因此我将不胜感激。

【问题讨论】:

    标签: jquery ajax promise


    【解决方案1】:

    你可以使用回调函数,比如

    $('#log-in').on('click', function() {
    
        // triggers validateAjax
        // pass anonymus function to be called when ajax is complete
        var validateBaan = validateAjax('fieldId', 'worker', function(){
    
            // every time I log it says undefined, even though it gets value 
            // (true or false), but too late
            // console.log(validateBaan);
    
            // this function works
            var validateShift = checkInput({
                shift: {
                    field: 'btn-group',
                    hasClass: 'active',
                    error: 'shifterror'
                }
            });
            // when both are true take some action
            if (validateShift) {
                ...
            }   
        });
    });
    
    
    function validateAjax(fieldId, query, callback) {
        var output;
    
       // field value
       var fieldValue = $('#' + fieldId).val();
    
       // sending ajax request
       var ajaxQuery = $.ajax({
         type: "GET",
         url: "update.php",
         data: 'checkup=checkup&baan=' + fieldValue
        });
    
       // based on the response, takes action
       ajaxQuery.done(function(response) {
          if (response.error) {
              output = false;
              $('.error-' + fieldId).html(response.error);
           } else if (response.product) {
              $.cookie('tab_name', response.product);
    
              //Call you function if condition is trure
              callback();
           }
       });
    }
    

    【讨论】:

    • Jeei,它成功了,非常感谢。现在我知道我需要使用回调来使这些事情起作用。再次感谢您!
    • 这个答案会起作用,但不需要传递回调。由于$.ajax() 返回的对象是promise 兼容的,它可以从validateAjax() 返回,并返回登录单击处理程序,以链式.done() 响应,其中第一个回调函数(也是唯一的) ) 范围。 nett 效果是相同的,但这是 jQuery 1.7+ 的处理方式。 Myt,请问您是否想要完整的代码,我将作为单独的答案发布
    【解决方案2】:

    将异步设置为 false:

    var ajaxQuery = $.ajax({
     async: false,
     type: "GET",
     url: "update.php",
     data: 'checkup=checkup&baan=' + fieldValue
    });
    

    这将等到 ajax 命令完成后再限制您的代码。

    【讨论】:

    • 由于 jQuery 1.8 不推荐使用异步。
    • 不要使用同步AJAX解决问题。这不是他们正确做事的方式(因此被弃用)。 Javascript 被设计为异步执行大多数操作,因此请学习使用它:)
    【解决方案3】:

    那是ajax吗,那你可以试试async: false

    设置 async to false 意味着您调用的语句必须 在调用函数中的下一条语句之前完成。

    自弃用以来,最有效的方法是使用 callback 函数来处理它。

    【讨论】:

    • 由于 jQuery 1.8 async 已被弃用,这就是我遇到这个问题的原因。
    • ...它被弃用的原因是 Javascript 中冗长的同步调用是一个非常糟糕的主意。学习使用回调:)
    • @Myt 我同意,然后去回调函数。我很快就找到了这个stackoverflow.com/a/18268209/1671639
    • RIP async 使用它非常有帮助。
    • @TrueBlueAussie 我应该这样做:D。
    猜你喜欢
    • 1970-01-01
    • 2020-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-02
    • 2011-08-16
    相关资源
    最近更新 更多