由JS函數返回值引發的一場”血案"


---恢復內容開始---

啊。。。  本來昨天晚上想寫來着,結果陪老婆看電視劇就忘了。。。 呢滴神啊,原諒我吧。

背景:昨天在項目中做一個小功能的時候,出現了個小問題,而且一開始找了半天也沒找到原因。問題是這樣的:

功能模塊:庫存模塊

具體業務:倉庫出庫

功能:1、單個產品出庫  2、批量產品出庫(這些產品是連號的)

問題出處:批量產品出庫。

具體實現:出庫人員要輸入產品的起始號碼和結束號碼,我在前台js做循環,為這些產品一個個出庫,但是在出庫前,我要判斷輸入的產品在庫存中的狀態,如果輸入的這個產品的狀態是不能出庫的,那么此產品也不能出庫。這時,一但有產品部能出庫,我就要終止循環(為什么終止循環式根據業務要求,這里不多做解釋了。我用ajax異步去判斷每個卡號是否可以出庫。

代碼如下:

OrderStock.ValidataProductsWouldOouPut = function () {
        .........
        .........
var startNum = 1; var endNum = 100; for (var i = startNum; i < endNum; i++) { var result = BeginValidateByNumber(i);

            if (!result) {
            alert("編號" + i + "出庫失敗");
           break;
           }

            }
        }

        function BeginValidateByNumber(_num) {
        ........   
        ........
$.post(
"url", { Num: _num }, function (data) { if (data.Success) { return true; } else { return false; } }); }

//代碼中的........代表前面的一些處理代碼我就省略掉了

 

可是函數BeginValidateByNumber每次的返回值都是個null的,就是result得到值一直都是undefined。我湊,我就郁悶了,不應該啊,js函數有返回值的我都用了好長時間了,也沒出先這個問題啊。

於是,經過筆者近一個小時的研究,終於發現問題的所在(其實這個問題挺二的,好吧,我也承認自己犯二了)。

原因在哪呢,其實true或這false的確返回去了,但是代碼中返回值 是 ajax中 function(data){}  這個毀掉函數的返回值。為了把這個問題說的更明白些,那就讓我們看看jquery的ajax函數都干了點啥吧。

 

下面代碼是我模擬了一下jquery的ajax函數,只是簡單的寫了一下,並且可能有些實現和query的不同,但大概思想是沒有錯的。(請小伙伴沒不要太較真。。。如果想在了解的清楚也行也可以去看jquery的源碼 ^_^)。

注:可能有的小伙伴經常直接$.post、$.get、$.ajax這么用,而從來沒有去了解過異步具體是怎么回事,那么也希望這些小伙伴去了解一下xmlhttprequest這么個東東,當然這和我們這一節的最終討論的問題不影響。

MyJqueryForAjax.js文件:

 1 //--------------------------Begin ----------------------------------
 2 var defaults = {
 3     url: "default.ashx",
 4     data: "",
 5     type: "get",
 6     sussessfn: null,
 7     errorfn: null,
 8     async: true
 9 };
10 
11 if (!window.MyJQ) window.MyJQ = {};
12 
13 MyJQ.Ajax = function (settings) {
14     var param = $.extend(defaults, settings);
15     var xmlhttp;
16     var jsonObject = param.data;
17     var jsonStr = "";
18     if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari
19         xmlhttp = new XMLHttpRequest();
20     }
21     else {// code for IE6, IE5
22         xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
23     }
24 
25     xmlhttp.onreadystatechange = function () {
26         if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
27             if (param.sussessfn) {
28                 var result = param.sussessfn(xmlhttp.responseText);//注意這里,這里調用了回調函數sussessfn,並且得到返回值
29                 alert("這里才是回調函數返回的值:" + result);
30             }
31         }
32     }
33     for (var item in jsonObject) {
34         jsonStr += (item + "=" + jsonObject[item] + "&");
35     }
36     jsonStr = jsonStr.substring(0, jsonStr.length - 1);
37 
38     if (param.type == "get") {
39         param.url += "?" + jsonStr;
40         param.data = null;
41     }
42 
43     xmlhttp.open(param.type, param.url, param.async);
44     xmlhttp.send(param.data);
45 };
46 
47 //---------------------------------end---------------------------

前台頁面:

 1 <html xmlns="http://www.w3.org/1999/xhtml">
 2 <head runat="server">
 3     <title></title>
 4     <script src="Script/jquery-1.9.1.js" type="text/javascript"></script>
 5     <script src="Script/MyJqueryForAjax.js" type="text/javascript"></script>
 6     <script type="text/javascript">
 7         $(document).delegate("#Btn_Test", "click", function () {
 8             var settings = {
 9                 url: "Handlers/TestHandler.ashx",
10                 type: "get",
11                 data: {
12                     name: "xiaoming",
13                     pwd: "123456"
14                 },
15                 sussessfn: function (data) {
16                     alert(data);
17                     if (data == "ok") {
18                         return true;
19                     }
20                     else {
21                         return false;
22                     }
23                 }
24             };
25             MyJQ.Ajax(settings);
26 
27         });
28     </script>
29 
30 </head>
31 <body>
32     <form id="form1" runat="server">
33     <div>
34             <input type="button" value="Test"  id="Btn_Test"/>
35     </div>
36     </form>
37 </body>
38 </html>

 

請求的Handlers/TestHandler.ashx的代碼:

 1 context.Response.ContentType = "text/plain";
 2             var _request = context.Request;
 3             string name = _request.Params["name"];
 4             string pwd = _request["pwd"];
 5             if (string.Equals(name, "xiaoming") && string.Equals(pwd, "123456"))
 6             {
 7                 context.Response.Write("ok");
 8             }
 9             else {
10                 context.Response.Write("no");
11             }

顯示結果:

 

我想不用我再多說什么,小伙伴們應該明白問題出在哪了吧^_^。

對了 成功這個單詞在代碼中我寫錯了,不好意思哈。

恩。。今天就到這吧,這篇文章可以給小伙伴們帶來幫助,也希望小伙伴們不要犯類似的錯誤,同時也希望大伙伴們給出各種意見和建議,這里我要說一聲very 3q。

啊。。。還有如果代碼中那塊我寫的不明吧,或者好伙伴們不理解,可以留言哦。

 源代碼下載

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM