1. 程式人生 > >回撥函式的返回值給全域性變數的賦值問題

回撥函式的返回值給全域性變數的賦值問題

            今天遇到一個問題,在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
			   });
		}