今天遇到一个问题,在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 }); }