---恢复内容开始---

啊。。。  本来昨天晚上想写来着,结果陪老婆看电视剧就忘了。。。 呢滴神啊,原谅我吧。

背景:昨天在项目中做一个小功能的时候,出现了个小问题,而且一开始找了半天也没找到原因。问题是这样的:

功能模块:库存模块

具体业务:仓库出库

功能: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函数返回值引发的一场”血案"的更多相关文章

  1. JS函数 返回值的函数 return sum;或者result = add2(3,4);

    返回值的函数 思考:上一节函数中,通过"document.write"把结果输出来,如果想对函数的结果进行处理怎么办呢? 我们只要把"document.write(sum ...

  2. JS异步函数 返回值

    1.  js 异步的几种情况 : 1.1 异步操作由浏览器内核的 webcore 来执行: onclick 由浏览器内核的 DOM Binding 模块来处理,当事件触发的时候,回调函数会立即添加到任 ...

  3. 关于QT中evaluateJavaScript()函数返回值的处理问题

    关于QT中evaluateJavaScript()函数返回值的处理问题 - 寒风问雪的专栏 - 博客频道 - CSDN.NET 关于QT中evaluateJavaScript()函数返回值的处理问题 ...

  4. C++函数返回值(02)

    对象作为返回值 编译器会将函数栈中的返回值数据拷贝到返回栈中 指针作为返回值 函数的返回值可以是存储某种类型数据的内存地址,称这种函数为指针函数.它们的一般定义形式如下:  类型标识符 *函数名(参数 ...

  5. 用C语言指针作为函数返回值

    转载:http://c.biancheng.net/cpp/html/3242.html C语言允许函数的返回值是一个指针(地址),我们将这样的函数称为指针函数.下面的例子定义了一个函数 strlon ...

  6. shell调用函数返回值深入分析

    编写shell脚本过程中,我们经常会自定义一些函数,并根据函数的返回值不同来执行相应的流程,那么我们如何来获取函数的返回值呢? 首先shell中调用函数有两种方式: 第一种:value=`functi ...

  7. Python从线程获取函数返回值

    Python中利用强大的threading模块可以很容易的实现多线程开发,提高运行速度.这一般是对某个进行大量计算操作的的函数进行多线程处理,然后合并各线程的结果.获取函数返回值的方法可以如下: 1) ...

  8. 速战速决 (3) - PHP: 函数基础, 函数参数, 函数返回值, 可变函数, 匿名函数, 闭包函数, 回调函数

    [源码下载] 速战速决 (3) - PHP: 函数基础, 函数参数, 函数返回值, 可变函数, 匿名函数, 闭包函数, 回调函数 作者:webabcd 介绍速战速决 之 PHP 函数基础 函数参数 函 ...

  9. string类find函数返回值判定

     string类find函数返回值判定 代码示例 #include<iostream> #include<cstring> using namespace std; int m ...

随机推荐

  1. windows安装ruby,DevKit安装rails,svn安装

    Ruby on Rails的安装,是从被称为RubyGems的包管理系统开始的.Ruby on Rails是由Ruby处理系统的类库的.被称为“gem”的格式来进行配置的.“gem”形式的类库,通过使 ...

  2. 基于Python的测试驱动开发实战

    近年来测试驱动开发(TDD)受到越来越多的关注.这是一个持续改进的过程,能从一开始就形成规范,帮助提高代码质量.这是切实可行的而非天马行空的. TDD的全过程是非常简单的.借助TDD,代码质量会得到提 ...

  3. Mastering the game of Go with deep neural networks and tree search浅析

    Silver, David, et al. "Mastering the game of Go with deep neural networks and tree search." ...

  4. Unity3D深入浅出 -组件与节点之间的调用关系

    一.transform组件用途 1.维护场景树 2.对3D物体的平移,缩放,旋转 二.场景树定义 在Hierarchy视图中显示的: 一个game_scene场景,下面有Main Camera节点,D ...

  5. 转载:IE下div使用margin:0px auto不居中的原因

    转自:http://www.blogjava.net/sealyu/archive/2010/01/08/308640.html 一般在将div居中显示时,使用css: divX {margin:0  ...

  6. R语言绘图边框的单位

    在R语言中指定画图边框时,通常使用两种单位, lines 和 inches 当然,这两个单位之间是可以相互转换的,那么 1 inch = ? line 答案是1 inches = 5 lines 下面 ...

  7. 同一种类型的两个对象赋值,用反射。再也不用点属性了。。。。(适用于ef)

    /// <summary> /// 给对象赋值的方法(不赋地址)(同一个类型),含过滤 /// </summary> /// <typeparam name=" ...

  8. 【Java面试题】23 java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用?

    java5 以前, 有如下两种:第一种:new Thread(){}.start();这表示调用 Thread 子类对象的 run 方法, new Thread(){}表示一个Thread 的匿名子类 ...

  9. 在express项目中使用formidable & multiparty实现文件上传

    安装 formidable,multiparty 模块 npm install formidable,multiparty –save -d 表单上传 <form id="addFor ...

  10. There are inconsistent line endings in the 'xxx' script. Some are Mac OS X (UNIX) and some are Windows.问题解决

    在Window上使用Visual Studio编辑Unity3D脚本时常会出现类似如下警告: 警告 1 There are inconsistent line endings in the 'Asse ...