JS同步和异步混用的问题

yueyufei3 2011-01-12 04:49:46
<script>
$("#btn").bind("click",function()
{
if($("#text1").attr("value")==""){return false;}
if($("#text2").attr("value")==""){return false;}

$.get("abc.ashx",function(data)
{
if($("#text3").attr("value")!=data){return false}
else{return true}
});


});
</script>


例如这样一个简单的JS 前2个if 都是同步 如果为空都会return false
第三个因为是异步 程序不会等待get得到数据 然后再判断true false 而是直接绕过get 返回一个true

请问大家都是如何解决这个问题(这个问题一般都是用于登录 text1 text2 是用户密码 text3是验证码 如果都合格了才让服务器验证密码)
...全文
953 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
tanyuwen66 2013-01-11
  • 打赏
  • 举报
回复
挺二楼,我将async为false,就解决问题
naifen00 2011-11-23
  • 打赏
  • 举报
回复
万恶的不能编辑。。再发一次!
首先 纠正一下 click function里的 return false 用处是取消dom默认时间 取消冒泡
另外 比较喜欢7楼对ajax同步异步的例子,很有帮助
楼主应该是想要下面的效果

$("#btn").bind("click", function(){
if ($("#text1").attr("value") != "" && $("#text2").attr("value") != "") {
$.get("abc.ashx", function(data){
if ($("#text3").attr("value") != data) {
window.console&&console.log('验证码校验成功');
}
else {
window.console&&console.log('验证码校验不成功');
}
});
}

});
</script>
naifen00 2011-11-23
  • 打赏
  • 举报
回复
[Quote=引用楼主 yueyufei3 的回复:]
JScript code

<script>
$("#btn").bind("click",function()
{
if($("#text1").attr("value")==""){return false;}
if($("#text2").attr("value")==""){return false;}

$.get("abc.ashx",function(data)
{……
[/Quote]

首先 纠正一下 click function里的 return false 用处是取消dom默认时间 取消冒泡
另外 比较喜欢7楼对ajax同步异步的例子,很有帮助
楼主应该是想要下面的效果
[code=JScript]<script>
$("#btn").bind("click", function(){
if ($("#text1").attr("value") != "" && $("#text2").attr("value") != "") {
$.get("abc.ashx", function(data){
if ($("#text3").attr("value") != data) {
window.console&&console.log('验证码校验成功');
}
else {
window.console&&console.log('验证码校验不成功');
}
});
}

});
</script>

hypnoz 2011-01-12
  • 打赏
  • 举报
回复
<script>
$("#btn").bind("click",function()
{
if($("#text1").attr("value")==""){return false;}
if($("#text2").attr("value")==""){return false;}

$.get("abc.ashx",function(data)
{
if($("#text3").attr("value")!=data){return false}
else{return true 改成$("form").submit();}
});


});
</script>
yueyufei3 2011-01-12
  • 打赏
  • 举报
回复
我的帖子已经说明了就是return的原因
我的意思是有什么办法怎么不用return 回调页面
比如
if($("#x1").attr("src")!=0){
//这里写点什么 不用return true 也能实现点击
//我记得有个_dopostback
}
return false;
  • 打赏
  • 举报
回复
只要你抱定必须返回true、false的思路,那么就注定你的程序的设计思路只能是阻塞的。而重新设计算法,就是把click之后根据返回条件为true时要做的事情(函数)作为参数传递给你的程序,然后你的程序才去注册click事件,这才能避免阻塞式的设计思路。
  • 打赏
  • 举报
回复
看看你的程序的背景,它整个流程(不考虑用什么语言编写)就是必须阻塞线程,其业务逻辑的背景就是要阻塞线程。不管是在发出http post命令时阻塞,还是所注册的处理click的函数内部阻塞(比如使用一个while循环),还是这个函数调用之后的下一个方法阻塞,总之都要等待到http post有返回值之后才能继续执行。你的程序的设计本身,不阻塞不行,这是设计问题。

当点击click之后,能不能把click所要做的下一步的事情注册给http post的回调函数呢?也就是说你的程序的设计初衷不应该是仅仅为了返回true、false,而是要求传递给它一个函数对象,然后由它负责调用这个函数,进行下一步操作。而click之后无需返回true或者false。

其实这让我想起了最近微软吵吵很热门的F#,它宣传它的 async { } 语法是多么方便好用。可是别忘记了,如果你做什么并行程序都只是一个顺序程序设计思路,那么除了编写出用阻塞来模拟多线程的程序,还能学到什么真正的多线程程序设计方法呢?而真正的多线程程序的算法“一看”就跟顺序程序算法风格是不同的,所以你使用F#之类的程序,貌似方便一点点,其实会阻塞你的将大量系统真正按多线程来重新设计算法。
huangwenquan123 2011-01-12
  • 打赏
  • 举报
回复
lz理解错了,程序是从上执行下来的,当你触发click事件后,如果text1为空的话直接return false了,不会执行下面的方法,
如果你两个都不为空的话才执行到那个$.get
反之,如果当页面加载的时候,就异步发送请求到后台获取返回的值,这时还没返回值就取不到
例子:

//因为是异步获取请求,所以alert(str)总是为空
//如果加个async:false,改为同步的话就会等待返回过来的值在继续加载页面
$(document).ready(function(){
var str="";
$.ajax({
url:"Handler.ashx",
type:"get",
success:function(result){
str=result;
}
})
alert(str);//总是为空
})


$(document).ready(function(){
var str="";
$.ajax({
url:"Handler.ashx",
type:"get",
async:false,
success:function(result){
str=result;
}
})
alert(str);//返回Hello World。我后台输出的是Hello World
})

同步请求一般我是在获取广告的时候在用到
吴青峰 2011-01-12
  • 打赏
  • 举报
回复
不是不访问,是不会刷新,你多用几次就明白了,一点技术含量都没有。
yueyufei3 2011-01-12
  • 打赏
  • 举报
回复
LS 看清楚问题
就算先判断验证码 js也不会等待回调完了 再return的
仍然是return true的
gongsun 2011-01-12
  • 打赏
  • 举报
回复
我日。。。

怎么不先判断 验证码 在去 校验 用户名、密码???

如果你 验证码的服务 和 判断用户名、密码的服务 分开写。

那就是 2个 同步的方法。

第一方法 返回true 执行下一个!

这个想想也不能 用异步啊!!!
yueyufei3 2011-01-12
  • 打赏
  • 举报
回复
LS 你那个是alert
如果是return true/false就不行了 因为return 其他的不会执行了 但是alert会等的
yueyufei3 2011-01-12
  • 打赏
  • 举报
回复
ajax async: false设置成false 不就直接不访问了
吴青峰 2011-01-12
  • 打赏
  • 举报
回复
<script>
$("#btn").bind("click",function()
{

$.ajax({
type:"POST",
data:{
s1:document.getElementById("s1").value,
s2:document.getElementById("s2").value,
s3:document.getElementById("s3").value,
ddl_Type1:document.getElementById("ddl_Type1").value,
ddl_unit:document.getElementById("ddl_unit").value,
txt_market:document.getElementById("txt_market").value,
txt_company:document.getElementById("txt_company").value,
txt_publish:document.getElementById("txt_publish").value,
ddl_Type2:document.getElementById("ddl_Type2").value,
txt_contact:document.getElementById("txt_contact").value
},
async: false,
cache: false,
url: "PriceData.aspx",
dataType:"text",
contentType:"application/x-www-form-urlencoded; charset=UTF-8",
timeout : 30000 ,
success:function()
{
alert('发布成功');
} ,
error : function()
{
alert('发布失败');
}
});


});
</script>
请参照这个.......

62,074

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧