使用回调

Working with callbacks

$('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);
    });
}

如何检查提交处理程序中的 done/fail?

是的,我知道这需要对 callbackasynchronous 执行 javascript 有基本的了解。我已经阅读了很多书籍和教程,但我似乎不明白。所以也许这里的一个例子会有所帮助。

最简单的回调参数添加方式:

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();
});

回调不是一个很难的概念。请记住,它们是 ints、strings、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
})

这样做的缺点是在大多数情况下使用全局变量是一种代码味道。有一些方法可以避免它们,但是需要更多的知识才能给出一个好的例子。