由JS函数返回值引发的一场”血案"
2013-09-07 16:57
316 查看
---恢复内容开始---
啊。。。 本来昨天晚上想写来着,结果陪老婆看电视剧就忘了。。。 呢滴神啊,原谅我吧。
背景:昨天在项目中做一个小功能的时候,出现了个小问题,而且一开始找了半天也没找到原因。问题是这样的:
功能模块:库存模块
具体业务:仓库出库
功能:1、单个产品出库 2、批量产品出库(这些产品是连号的)
问题出处:批量产品出库。
具体实现:出库人员要输入产品的起始号码和结束号码,我在前台js做循环,为这些产品一个个出库,但是在出库前,我要判断输入的产品在库存中的状态,如果输入的这个产品的状态是不能出库的,那么此产品也不能出库。这时,一但有产品部能出库,我就要终止循环(为什么终止循环式根据业务要求,这里不多做解释了。我用ajax异步去判断每个卡号是否可以出库。
代码如下:
if (!result) {
alert("编号" + i + "出库失败");
break;
}
可是函数BeginValidateByNumber每次的返回值都是个null的,就是result得到值一直都是undefined。我凑,我就郁闷了,不应该啊,js函数有返回值的我都用了好长时间了,也没出先这个问题啊。
于是,经过笔者近一个小时的研究,终于发现问题的所在(其实这个问题挺二的,好吧,我也承认自己犯二了)。
原因在哪呢,其实true或这false的确返回去了,但是代码中返回值 是 ajax中 function(data){} 这个毁掉函数的返回值。为了把这个问题说的更明白些,那就让我们看看jquery的ajax函数都干了点啥吧。
下面代码是我模拟了一下jquery的ajax函数,只是简单的写了一下,并且可能有些实现和query的不同,但大概思想是没有错的。(请小伙伴没不要太较真。。。如果想在了解的清楚也行也可以去看jquery的源码 ^_^)。
注:可能有的小伙伴经常直接$.post、$.get、$.ajax这么用,而从来没有去了解过异步具体是怎么回事,那么也希望这些小伙伴去了解一下xmlhttprequest这么个东东,当然这和我们这一节的最终讨论的问题不影响。
MyJqueryForAjax.js文件:
前台页面:
请求的Handlers/TestHandler.ashx的代码:
显示结果:
我想不用我再多说什么,小伙伴们应该明白问题出在哪了吧^_^。
对了 成功这个单词在代码中我写错了,不好意思哈。
恩。。今天就到这吧,这篇文章可以给小伙伴们带来帮助,也希望小伙伴们不要犯类似的错误,同时也希望大伙伴们给出各种意见和建议,这里我要说一声very 3q。
啊。。。还有如果代码中那块我写的不明吧,或者好伙伴们不理解,可以留言哦。
源代码下载
啊。。。 本来昨天晚上想写来着,结果陪老婆看电视剧就忘了。。。 呢滴神啊,原谅我吧。
背景:昨天在项目中做一个小功能的时候,出现了个小问题,而且一开始找了半天也没找到原因。问题是这样的:
功能模块:库存模块
具体业务:仓库出库
功能: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文件:
//--------------------------Begin ---------------------------------- var defaults = { url: "default.ashx", data: "", type: "get", sussessfn: null, errorfn: null, async: true }; if (!window.MyJQ) window.MyJQ = {}; MyJQ.Ajax = function (settings) { var param = $.extend(defaults, settings); var xmlhttp; var jsonObject = param.data; var jsonStr = ""; if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari xmlhttp = new XMLHttpRequest(); } else {// code for IE6, IE5 xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); } xmlhttp.onreadystatechange = function () { if (xmlhttp.readyState == 4 && xmlhttp.status == 200) { if (param.sussessfn) { var result = param.sussessfn(xmlhttp.responseText);//注意这里,这里调用了回调函数sussessfn,并且得到返回值 alert("这里才是回调函数返回的值:" + result); } } } for (var item in jsonObject) { jsonStr += (item + "=" + jsonObject[item] + "&"); } jsonStr = jsonStr.substring(0, jsonStr.length - 1); if (param.type == "get") { param.url += "?" + jsonStr; param.data = null; } xmlhttp.open(param.type, param.url, param.async); xmlhttp.send(param.data); }; //---------------------------------end---------------------------
前台页面:
<html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> <script src="Script/jquery-1.9.1.js" type="text/javascript"></script> <script src="Script/MyJqueryForAjax.js" type="text/javascript"></script> <script type="text/javascript"> $(document).delegate("#Btn_Test", "click", function () { var settings = { url: "Handlers/TestHandler.ashx", type: "get", data: { name: "xiaoming", pwd: "123456" }, sussessfn: function (data) { alert(data); if (data == "ok") { return true; } else { return false; } } }; MyJQ.Ajax(settings); }); </script> </head> <body> <form id="form1" runat="server"> <div> <input type="button" value="Test" id="Btn_Test"/> </div> </form> </body> </html>
请求的Handlers/TestHandler.ashx的代码:
context.Response.ContentType = "text/plain"; var _request = context.Request; string name = _request.Params["name"]; string pwd = _request["pwd"]; if (string.Equals(name, "xiaoming") && string.Equals(pwd, "123456")) { context.Response.Write("ok"); } else { context.Response.Write("no"); }
显示结果:
我想不用我再多说什么,小伙伴们应该明白问题出在哪了吧^_^。
对了 成功这个单词在代码中我写错了,不好意思哈。
恩。。今天就到这吧,这篇文章可以给小伙伴们带来帮助,也希望小伙伴们不要犯类似的错误,同时也希望大伙伴们给出各种意见和建议,这里我要说一声very 3q。
啊。。。还有如果代码中那块我写的不明吧,或者好伙伴们不理解,可以留言哦。
源代码下载
相关文章推荐
- 由"@id/myid"引发的一场血案
- 【运维囧事】NTP服务器引发的一场血案
- SwipeRefreshLayout 引发的一场血案
- C之有趣-strlen()函数引发的一场“血案”
- Android 4.0 中由ProGuard引发的一场血案
- 小小<p>标签引发引入百度编辑器出错的"血案"
- 2毛钱引发的"youni血案!!"
- CentOS系统故障 | 一桩"血案"引发的容器存储驱动比较
- oracle jdbc 邪恶数字"65536" ---批量插入10万条记录引发的“血案”
- Android 4.0 中由ProGuard引发的一场血案
- 由Cstring转LPWSTR而引发的一场血案
- 由Cstring转LPWSTR而引发的一场血案
- 一场由字符数组char szvalue[30]引发的“血案“
- Android 4.0 中由ProGuard引发的一场血案,
- Gitlab:一场“删库”血案引发的反思
- 由Unity5.3.3f1引发的一场血案
- 一场由过滤器Filter引发的血案
- char* p="test"引发的血案
- 一场.user.ini引发的血案
- 一场版本升级引发的性能血案的追凶过程