由JS函数返回值引发的一场”血案"
---恢复内容开始---
啊。。。 本来昨天晚上想写来着,结果陪老婆看电视剧就忘了。。。 呢滴神啊,原谅我吧。
背景:昨天在项目中做一个小功能的时候,出现了个小问题,而且一开始找了半天也没找到原因。问题是这样的:
功能模块:库存模块
具体业务:仓库出库
功能:1、单个产品出库 2、批量产品出库(这些产品是连号的)
问题出处:批量产品出库。
具体实现:出库人员要输入产品的起始号码和结束号码,我在前台js做循环,为这些产品一个个出库,但是在出库前,我要判断输入的产品在库存中的状态,如果输入的这个产品的状态是不能出库的,那么此产品也不能出库。这时,一但有产品部能出库,我就要终止循环(为什么终止循环式根据业务要求,这里不多做解释了。我用ajax异步去判断每个卡号是否可以出库。
代码如下:
OrderStock.ValidataProductsWouldOouPut = function () {
.........
.........
var startNum = ;
var endNum = ;
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 == && xmlhttp.status == ) {
if (param.sussessfn) {
var result = param.sussessfn(xmlhttp.responseText);//注意这里,这里调用了回调函数sussessfn,并且得到返回值
alert("这里才是回调函数返回的值:" + result);
}
}
}
for (var item in jsonObject) {
jsonStr += (item + "=" + jsonObject[item] + "&");
}
jsonStr = jsonStr.substring(, jsonStr.length - ); 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: ""
},
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, ""))
{
context.Response.Write("ok");
}
else {
context.Response.Write("no");
}
显示结果:
我想不用我再多说什么,小伙伴们应该明白问题出在哪了吧^_^。
对了 成功这个单词在代码中我写错了,不好意思哈。
恩。。今天就到这吧,这篇文章可以给小伙伴们带来帮助,也希望小伙伴们不要犯类似的错误,同时也希望大伙伴们给出各种意见和建议,这里我要说一声very 3q。
啊。。。还有如果代码中那块我写的不明吧,或者好伙伴们不理解,可以留言哦。
由JS函数返回值引发的一场”血案"的更多相关文章
- JS函数 返回值的函数 return sum;或者result = add2(3,4);
返回值的函数 思考:上一节函数中,通过"document.write"把结果输出来,如果想对函数的结果进行处理怎么办呢? 我们只要把"document.write(sum ...
- JS异步函数 返回值
1. js 异步的几种情况 : 1.1 异步操作由浏览器内核的 webcore 来执行: onclick 由浏览器内核的 DOM Binding 模块来处理,当事件触发的时候,回调函数会立即添加到任 ...
- 关于QT中evaluateJavaScript()函数返回值的处理问题
关于QT中evaluateJavaScript()函数返回值的处理问题 - 寒风问雪的专栏 - 博客频道 - CSDN.NET 关于QT中evaluateJavaScript()函数返回值的处理问题 ...
- C++函数返回值(02)
对象作为返回值 编译器会将函数栈中的返回值数据拷贝到返回栈中 指针作为返回值 函数的返回值可以是存储某种类型数据的内存地址,称这种函数为指针函数.它们的一般定义形式如下: 类型标识符 *函数名(参数 ...
- 用C语言指针作为函数返回值
转载:http://c.biancheng.net/cpp/html/3242.html C语言允许函数的返回值是一个指针(地址),我们将这样的函数称为指针函数.下面的例子定义了一个函数 strlon ...
- shell调用函数返回值深入分析
编写shell脚本过程中,我们经常会自定义一些函数,并根据函数的返回值不同来执行相应的流程,那么我们如何来获取函数的返回值呢? 首先shell中调用函数有两种方式: 第一种:value=`functi ...
- Python从线程获取函数返回值
Python中利用强大的threading模块可以很容易的实现多线程开发,提高运行速度.这一般是对某个进行大量计算操作的的函数进行多线程处理,然后合并各线程的结果.获取函数返回值的方法可以如下: 1) ...
- 速战速决 (3) - PHP: 函数基础, 函数参数, 函数返回值, 可变函数, 匿名函数, 闭包函数, 回调函数
[源码下载] 速战速决 (3) - PHP: 函数基础, 函数参数, 函数返回值, 可变函数, 匿名函数, 闭包函数, 回调函数 作者:webabcd 介绍速战速决 之 PHP 函数基础 函数参数 函 ...
- string类find函数返回值判定
string类find函数返回值判定 代码示例 #include<iostream> #include<cstring> using namespace std; int m ...
随机推荐
- copy src remote_src false表示本地,true在远程
文件组装模块-assemble assemble主要是将多份配置文件组装为一份配置文件. 参数 必填 默认 选项 说明 Backup 否 No Yes/no 是否创建备份文件,使用时间戳 Delimi ...
- 周末大礼:jQuery技巧总结
一.简介 1.1.概述 随着WEB2.0及ajax思想在互联网上的快速发展传播,陆续出现了一些优秀的Js框架,其中比较著名的有Prototype.YUI.jQuery.mootools.Bindows ...
- 关于Cocos2d-x中坐标系的种类和转换
注意: 当一个节点有一个子节点的时候,如果移动父节点,子节点也会跟着做相应的移动变化,只要被添加到父节点中,子节点就被绑定了,所以子节点的位置,坐标就会被动地变化. 当一个节点有一个子节点的时候,如果 ...
- 关于Cocos2d-x物理引擎用到的类和使用
其实就是这三类PhysicsWorld类,PhysicsBody类,PhysicsShape类. 1.PhysicsWorld类 PhysicsWorld对象代表Cocos2d-x中的物理世界,这个世 ...
- ubuntu开启SSH服务远程登录
http://blog.csdn.net/jackghq/article/details/54974141 ubuntu开启SSH服务远程登录
- EasyTouch的使用官方文档操作步骤
对于移动平台上的RPG类的游戏,我们常用虚拟摇杆来控制人物角色的行走和一些行为,相信我们对它并不陌生,之前尝试了EasyTouch2.5,发现并没有最新版的3.1好用,2.5版本的对于自适应没有做的很 ...
- c语言常用数据类型转换整理
你要发送原始数据流 还是 格式化输出? 如果是格式化 按原子说的 ,用sprintf / printf; 如果发送原始内存数据流, 可按下面发送, 发送 #define BYTE0(pointer) ...
- listView解决滑动时黑色背景问题
listView.setCacheColorHint(Color.TRANSPARENT);//解决滑动时黑色背景问题 listView滑动时黑色背景问题 原因在于ListView存在缓存颜色机制,因 ...
- ios开发之--简单动画效果的添加
记录一个简单的动画效果,自己写的,很简单,仅做记录. 附一个demo的下载地址: https://github.com/hgl753951/hglTest.git 代码如下: 1,准备 BOOL _i ...
- ios 在https情况下,使用webview加载url出错的解决方法 ios9 适配问题
修改info.plist文件,添加App Transport Security Settings,然后在这个里面添加Allow Arbitrary Loads,改为yes 如下图: