jquery ajax 在回调函数内 给变量赋值,为啥返回不出去?那要怎么处理
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了jquery ajax 在回调函数内 给变量赋值,为啥返回不出去?那要怎么处理相关的知识,希望对你有一定的参考价值。
比如jquery代码如下
function UpdateModel()
var retVal = -1;//初始值
var model = new Object();
model.userID = $("#txtUserId").val();
model.UserName=$("#txtUserName").val();
MyTestAjaxWebservice.WebService.UpdateModel(
model,
function(data)
if (data > 0)
alert(data);//这里值为1。反正webservice里的方法是成功的,数据库也更新成功了。
retVal = data;//注意这里。。。。
, onFailed
);
alert(retVal);// 这里的值,永远都是-1也就是回调函数赋值不成功
这里是 webservice的方法:改方法是绝对可以成功执行的,请不要在此做文章。
[WebMethod]
public int UpdateModel(UserT model)
return sqlhelper.UpdateUser(model);
编程环境
ASP.NET 下
var re = 0;
function test()
alert(re);//num1
re = testAjax();
alert(re);//num3
function testAjac()
$.ajax(
type:"post",
url:"",
dataType:"json",
success:function(data)
re = 1
alert(re);//num2
);
上面执行alert的顺序肯定是num1,num3,num2,并且alert出来的值是0,0,1;
当然如果你的请求足够快(几乎不可能),快到比本页面还快,那么顺序就会是num1,num2,num3了 参考技术A 1 全局变量的作用域是全局性的,即在整个javascript程序中,全局变量处处都在。
2 而在函数内部声明的变量,只在函数内部起作用。这些变量是局部变量,作用域是局部性的;函数的参数也是局部性的,只在函数内部起作用。本回答被提问者和网友采纳 参考技术B function UpdateModel()
var retVal = -1;//初始值
var model = new Object();
model.userID = $("#txtUserId").val();
model.UserName=$("#txtUserName").val();
MyTestAjaxWebservice.WebService.UpdateModel(
model,
function(data)
if (data > 0)
alert(data);//这里值为1。反正webservice里的方法是成功的,数据库也更新成功了。
retVal = data;//注意这里。。。。
alert(retVal + "ajax成功");
else
alert("不成功!");
, onFailed
);
//alert(...)不再写在ajax函数外面 因为当你alert的时候ajax还在执行 并没有执行到retVal = data;这一步,这就是ajax异步执行的特点 如果你要alert 必须在ajax函数里面。
参考技术C function(data)
if (data > 0)
alert(data);//这里值为1。反正webservice里的方法是成功的,数据库也更新成功了。
retVal = data;//注意这里。。。。
,
alert(retVal);// 这里的值,永远都是-1也就是回调函数赋值不成功
出了这个大括号 函数 当然失效了 永远都是-1啊 在里面还差不多... 参考技术D ajax的时候,回调函数实际上已经和原函数分离了。所以ajax的回调方法,要写在处理函数里面,而不是外面的函数里。
jquery.Ajax回调成功后数据赋值给全局变量的问题
先来看一代码
function checkoldpass($pass) { $.ajax({ type: ‘get‘, url: ‘/admin/check‘, data: {‘password‘: $pass}, dataType: ‘json‘, success: function (data) { console.log(data) } }); console.log(123); }
这个运行结果是:
浏览器控制台先打印:123,然后才打印返回来的data。
为什么会是这样。因为js ajax请求原生就是异步的。
这就是说如果你在ajax回调函数外声明的变量,在ajax外打印会是null或者是undefined
function checkoldpass($pass) { var msg = null; $.ajax({ type: ‘get‘, url: ‘/admin/check‘, data: {‘password‘: $pass}, dataType: ‘json‘, success: function (data) { msg = data } }); console.log(msg); }
这样打印出来的msg肯定是null。因为是异步的,所以js顺序执行到msg这里肯定是空了。
解决这个问题的办法
function checkoldpass($pass) { var msg = null; $.ajax({ type: ‘get‘, url: ‘/admin/check‘, data: {‘password‘: $pass}, dataType: ‘json‘, async:false, success: function (data) { msg = data } }); console.log(msg); }
在请求的代码里加上async:false,把请求设置为同步的。这样只有回调之后,js才会执行下面的代码。
但这种体验个人感觉不好。还是在回调里完成其它的操作比较好。
以上是关于jquery ajax 在回调函数内 给变量赋值,为啥返回不出去?那要怎么处理的主要内容,如果未能解决你的问题,请参考以下文章
jQuery $.get(url,data,callback,type) 返回值给全局变量赋值的问题
如何将Ext.Ajax.request请求 返回的值赋值给全局变量
jquery ajax success 函数 异步调用方法中不能给全局变量赋值的原因及解决办法