2015-07-09 77 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