今天遇到一个问题,在js中,回调函数的返回值对全局变量进行赋值,网上的解决方案主要是把异步改为同步 async: false,好记性不如烂笔头来记录一下。
源代码如下:
$('#loginSubmit').click(function(){
var useremail = $("#login_email").val();
var password = $("#login_password").val();
var emailHash = HASH.md5(useremail);
var newPsd = 0;
AUTH.fnPreLogin(emailHash,function(json){
console.log("success, token = " + json.data.pre_login_token);
newPsd = HASH.md5(HASH.md5(password)+json.data.pre_login_token);
console.log("newPSD: " + newPsd);
idcode = json.data.pre_login_token;
console.log("idcode: "+idcode);
});
AUTH.fnLogin(emailHash,newPsd,idcode,function(json){
console.log("success, token = " + json.data.token);
});
});
报错fnLogin在调用newPsd时,newPsd未能在回调函数中赋值成功,其中的fnPreLogin 和fnLogin的定义如下:
function fnPreLogin(email,callback){
console.log("fnPreLogin");
var myDate = new Date();
var preData = {
email: email,
time:myDate.toLocaleTimeString()
};
$.get(url_preLogin, preData, callback);
}
function fnLogin(email,psd,code,callback){
console.log("fnLogin");
var myDate = new Date();
var data = {
email: email,
password: psd,
idcode: code,
time:myDate.toLocaleTimeString()
};
$.get(url_login, data, callback);
}
在fnPreLogin()异步改为同步 async: false,用ajax方法实现即可,更改如下:
function fnPreLogin(email,callback){
console.log("fnPreLogin");
var myDate = new Date();
var preData = {
email: email,
time:myDate.toLocaleTimeString()
};
$.ajax({
url: url_preLogin,
async: false,
type: "GET",
data: preData,
success: callback
});
}