【问题标题】:Callback on custom function自定义函数回调
【发布时间】:2015-10-12 10:09:42
【问题描述】:

我有这样的功能

function is_register(user_id){
    $.ajax({
        method: "POST",
        url: "functions.php",
        data: {user_id: user_id, action: "is_registred"}
    }).done(function(data) {
        return data;
    });
}

我想在我的代码的其他地方执行这个函数,但它不起作用:

is_register(user_infos.id, function(is_registred_status){   
    console.log(is_registred_status);
}

如您所见,我希望“is_register”函数在继续之前完全执行,因此我创建了一个回调函数来记录结果。我哪里错了?

【问题讨论】:

    标签: jquery function callback


    【解决方案1】:

    仅仅添加一个函数作为参数并不能使它成为一个“回调”:)
    您必须在 is_register 内的“正确”位置调用它。

    另一个问题是is_register 函数中的.done() 部分。在传递的回调函数中,您将返回 $.ajax() 调用收到的值。但这没用,因为该值将无法访问 (How to return the response of an asynchronous call)

    在这种情况下,我将改为返回 $.ajax() (jqXHR object) 的返回值,并将 .done() 部分移到 is_register 函数之外。

    function is_register(user_id){
        return $.ajax({
            method: "POST",
            url: "functions.php",
            data: {user_id: user_id, action: "is_registred"}
        })
    }
    
    is_register(user_infos.id)
        .done(function(is_registred_status){   
            console.log(is_registred_status);
        };
    

    【讨论】:

    • 嘿伙计,您需要在代码中添加一些描述,它的代码质量很差。没想到像你这样的人会这样。
    【解决方案2】:
    function is_register(user_id , callback)
    {
        $.ajax({
            method: "POST",
            url: "functions.php",
            data: {user_id: user_id, action: "is_registred"}
        }).done(function(data) {
            if(callback)
                callback(data);
        });
    }
    

    【讨论】:

      【解决方案3】:

      你需要使用jQuery.when(),它提供了一种基于一个或多个对象执行回调函数的方法,通常是代表异步事件的Deferred对象。

      jQuery 代码:

      function is_register(user_id){
        return $.ajax({
          method: "POST",
          url: "functions.php",
          data: {user_id: user_id, action: "is_registred"}
        }).done(function(data) {
           return data;
        });
      }
      
      $.when(is_register(user_infos.id)).done(function(){
          console.log(is_registred_status);
      });
      

      注意:如果它只是一个延迟对象,你的目标就像在这种情况下,那么你不需要使用$.when(),而是可以使用.done()/.success()回调来达到这个目的。

      【讨论】:

      • 这不起作用,因为is_register 的返回值为undefined
      • 啊,没注意,现在is_register() 会返回一个延迟对象
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-01
      • 1970-01-01
      • 2014-06-07
      • 1970-01-01
      • 2023-03-30
      相关资源
      最近更新 更多