回撥函式的返回值給全域性變數的賦值問題
阿新 • • 發佈:2019-01-27
今天遇到一個問題,在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 }); }