使用回调

时间:2015-07-09 22:10:37

标签: javascript jquery asynchronous callback

$('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。我已经阅读了不少书和教程,但我似乎没有得到它。所以这里的一个例子可能有所帮助。

1 个答案:

答案 0 :(得分: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();
});

回调不是一个困难的概念。请记住,它们是诸如整数,字符串,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
})

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