2015-07-09 46 views
-2
$('form#register').on('submit', function(e) { 
    e.preventDefault(); 
    userAuth(this); 
    // if done : do a 
    // if fail : do b 
}); 
$('form#login').on('submit', function(e) { 
    e.preventDefault(); 
    userAuth(this); 
    // if done : do x 
    // if fail : do y 
}); 

function userAuth(form) { 
    console.log($(form).serialize()); 
    var request = $.ajax({ 
     url: 'process.php', 
     cache: false, 
     type: 'POST', 
     data: $(form).serialize() 
    }); 
    request.done(function (msg) { 
     console.log(msg); 
    }); 
    request.fail(function(jqXHR, textStatus) { 
     console.log(jqXHR, textStatus); 
    }); 
} 

如何在提交处理程序中检查完成/失败?使用回调

是的,我知道这需要对callbackasynchronous执行javascript的基本了解。我已经阅读了不少书籍和教程,但我似乎没有得到它。所以也许这里的例子会有所帮助。添加回调参数

+2

请提供更多信息和一个可靠的问题。 – PBLC

+0

我还没完全理解你的问题。你想为userAuth的'done'和'fail'传递回调函数吗? – Andre

+0

@Andre是的,我想在** userAuth完成后做些**,所以我认为是的回调函数。这个概念还不清楚。 – 3zzy

回答

2

最简单的方法:

function userAuth(form, doneCallback, failCallback) { 
    console.log($(form).serialize()); 
    var request = $.ajax({ 
     url: 'process.php', 
     cache: false, 
     type: 'POST', 
     data: $(form).serialize() 
    }); 
    request.done(doneCallback); 
    request.fail(failCallback); 
} 

,并调用它为:

$('form#register').on('submit', function(e) { 
    e.preventDefault(); 
    userAuth(this, function(){ 
     //I'm done 
    }, function(){ 
     //I failed 
    }); 
}); 

记住回调函数将收到相同的参数从jQuery的的donefail。如果你不想要,请将它们称为:

request.done(function (msg) { 
    doneCallback(); 
}); 
request.fail(function(jqXHR, textStatus) { 
    failCallback(); 
}); 

回调不是一个困难的概念。请记住,它们是像int,字符串,RegExps等参数。它们恰好是一个函数,所以它们可以被调用。

编辑回答评论

您可以保存在一个以上的方式从一个函数值:

var globalVariable; 

userAuth(this, function() { 
    var myValue = 4; // local variable 

    globalVariable = myValue; 

    window.explicitGlobalVariable = myValue; // same as above, except I haven't created a variable beforehand 

    implicitGlobalVariable = myValue; // I'm omitting var keyword, so it will leak to global scope 
}) 

这样做的缺点是使用全局变量是在大多数代码异味案例。有一些方法可以避免它们,但它需要更多的知识才能达到您需要达到的效果,以举例说明。

+0

我明白了,太棒了!如果要将回调中的值保存到回调之外定义的全局变量中,该怎么办?它是否也必须作为函数传递? – 3zzy

+0

@ 3zzy包含在答案中,请参阅编辑 – Andre