【jQuery】(7)---jQueryAjax同步异步区别
jQueryAjax同步异步
今天在项目开发过程中,要实现这么一个功能
<!-- 当我点击就业的时候,触发onclick时间,check()方法里通过ajax请求返回数据,
如果该用户已经毕业可以跳转到job.html如果没有毕业不能跳转页面同时弹框提示 -->
<a href="job.html" onclick="return check()">就业</a>
我们都知道onclick是优先执行于href属性的,只有onclick返回true才会执行href。接下来看js怎么写的
function check(){
var fal=false;
$.post("URL", function(date){
if(date==null || date==""){
fal=true;
return fal;//其实这个return也只是返回ajax中function的返回值。而不是check()的返回值
}else{
alert("请先毕业才能就业")
}
})
return fal;
/*最终发现如果该用户已经毕业,a标签没有任何反应,
如果还没有毕业,会提示:请先毕业才能就业。界面也是没有反应*/
}
这就很纳闷了,明明返回数据是空,fal变成了ture,怎么最终返回还是false。这就是同步和异步的区别了。
首先,ajax默认情况下是异步的,那什么是异步呢
async默认的设置值为true,这种情况为异步方式,就是说当ajax发送请求后,在等待server端返回的这个过程中,前台会继续 执行ajax块后面的脚本,直到server端返回正确的结果才会去执行success,也就是说这时候执行的是两个线程,ajax块发出请求后一个线程 和ajax块后面的脚本(另一个线程)
js举例:
$(function() {
$.ajax({
type : 'post',
async : true,
url : '',
cache : false,
data : {},
success : function(data){
alert("1111");
}
});
alert("22222");
});
/*在这里方法中,因为它是异步的,所以它在通过ajax向后端交互的同时,它还会向下执行js代码,就相当于有两个线程
所以这里是会先弹出"2222",才会弹出"1111",到这个时候,才知道为什么上面js为什么总是返回false,因为异步的时候
它先执行了下面的return fal,就已经返回flase了*/
所以我们只要把async的属性值改为false就变成同步了
$.post没有这个同步异步设置 ,如果一定要设置异步,只能在执行$.post之前加$.ajaxSettings.async = false; (同步执
行)
所以把最上面js改成同步,就可以实现相关功能了
function check(){
var fal=false;
$.ajax({
type: "POST",
url: "url",
async:false, //同步方式
success: function(re){
if(re==null||re==""){
fal=true;
}else{
alert("请先毕业才能就业");
}
}
});
return fal;
}
同步和异步的区别
简单理解:同步的意思是当JS代码加载到当前AJAX的时候会把页面里所有的代码停止加载,页面出去假死状态,当这个AJAX执行完毕后才会继续运行其他代码页面假死状态解除。
而异步则这个AJAX代码运行中的时候其他代码一样可以运行。
异步:在异步模式下,当我们使用AJAX发送完请求后,可能还有代码需要执行。这个时候可能由于种种原因导致服务器还没有响应我们的请求,但是因为我们采用了异步执行方式,所有包含AJAX请求代码的函数中的剩余代码将继续执行。如果我们是将请求结果交由另外一个JS函数去处理的,那么,这个时候就好比两条线程同时执行一样。
同步:在同步模式下,当我们使用AJAX发送完请求后,后续还有代码需要执行,我们同样将服务器响应交由另一个JS函数去处理,但是这时的代码执行情况是:在服务器没有响应或者处理响应结果的JS函数还没有处理完成return时,包含请求代码的函数的剩余代码是不能够执行的。就好比单线程一样,请求发出后就进入阻塞状态,知道接触阻塞余下的代码才会继续执行。
如果哪里理解不到位,或者理解错了,欢迎指点。
想的太多,做的太少,中间的落差就是烦恼,要么去做,要么别想 少尉【17】
【jQuery】(7)---jQueryAjax同步异步区别的更多相关文章
- 几种IO情况的学习和总结 关于 =====阻塞/非阻塞以及同步/异步区别
同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案是不同的.所以先限定一下本文的上下文. 背景是Linux环境下的network IO. 在进行解释 ...
- jquery的ajax同步异步执行
大家先看一段简单的jquery ajax 返回值的js 代码 function getReturnAjax{ $.ajax({ type:"POST", http:/ ...
- pythonのgevent同步异步区别
#!/usr/bin/env python from urllib import request import gevent from gevent import monkey import time ...
- 【转载】高性能IO设计 & Java NIO & 同步/异步 阻塞/非阻塞 Reactor/Proactor
开始准备看Java NIO的,这篇文章:http://xly1981.iteye.com/blog/1735862 里面提到了这篇文章 http://xmuzyq.iteye.com/blog/783 ...
- js中ajax连接服务器open函数的另外两个默认参数get请求和默认异步(open的post方式send函数带参数)(post请求和get请求区别:get:快、简单 post:安全,量大,不缓存)(服务器同步和异步区别:同步:等待服务器响应当中浏览器不能做别的事情)(ajax和jquery一起用的)
js中ajax连接服务器open函数的另外两个默认参数get请求和默认异步(open的post方式send函数带参数)(post请求和get请求区别:get:快.简单 post:安全,量大,不缓存)( ...
- ajax中的async属性值之同步和异步及同步和异步区别
jquery中ajax方法有个属性async用于控制同步和异步,默认是true,即ajax请求默认是异步请求,有时项目中会用到AJAX同步.这个同步的意思是当JS代码加载到当前AJAX的时候会把页面里 ...
- 同步与异步区别,Invoke与BeginInoke的区别
先说同步与异步的区别,总说同步异步的,其实一直不清楚什么是同步异步,今天找了一下: 同步:当一个消息发送后,等对方回应后继续发送下一条指令. 异步:当一个消息发送后,不等对方回应就发送下一条. 同步, ...
- java中同步异步阻塞和非阻塞的区别
同步 所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回. 按照这个定义,其实绝大多数函数都是同步调用(例如sin, isdigit等).但是一般而言,我们在说同步.异步的时候,特 ...
- 哪5种IO模型?什么是select/poll/epoll?同步异步阻塞非阻塞有啥区别?全在这讲明白了!
系统中有哪5种IO模型?什么是 select/poll/epoll?同步异步阻塞非阻塞有啥区别? 本文地址http://yangjianyong.cn/?p=84转载无需经过作者本人授权 先解开第一个 ...
随机推荐
- Java连接MySQL数据库增删改查通用方法
版权声明:本文为博主原创文章,未经博主允许不得转载. Java连接MySQL数据库增删改查通用方法 运行环境:eclipse+MySQL 以前我们Java连接MySQL数据库都是一个数据库写一个类,类 ...
- ssm学习(五)--加入分页插件
之前我们的查询列表是将所有的数据查询出来,并没有做分页,当数据很少的时候,是不需要分页,但是如果数据很多的时候,所有数据显示在一个页面显然是不合适的. 之前用hibernate的时候,可以直接通过查询 ...
- Python爬虫(二十二)_selenium案例:模拟登陆豆瓣
本篇博客主要用于介绍如何使用selenium+phantomJS模拟登陆豆瓣,没有考虑验证码的问题,更多内容,请参考:Python学习指南 #-*- coding:utf-8 -*- from sel ...
- 关于flask登录视图报错AttributeError: '_AppCtxGlobals' object has no attribute 'user'
在一个小程序中写了一个登录视图函数,代码如下: @app.route('/login',methods = ['GET','POST']) @oid.loginhandler def login(): ...
- spring boot项目如何测试,如何部署
有很多网友会时不时的问我,spring boot项目如何测试,如何部署,在生产中有什么好的部署方案吗?这篇文章就来介绍一下spring boot 如何开发.调试.打包到最后的投产上线. 开发阶段 单元 ...
- 自定义控件详解(七):drawText()
比较基础的一个方法.即绘制文本 使用如下: Paint paint = new Paint(); paint.setColor(Color.RED); // 红色字体 paint.setStyle(P ...
- 【ANT】java项目生成文件示例
<?xml version="1.0" ?> <project default="dist"> <property name=&q ...
- list.add(),向List集合插入对象报空指针异常
开始的时候我没有判断添加的随想是否为空,直接add;后来加了一个判断,判断了对象不等于空,但是运行程序还是报空指针,这时我发现应该是List出问题了: 查了下资料,发现我初始化List方法不对,如果只 ...
- Swift3.0 UITextField
import UIKit private var textfieldd = UITextField() class TextFieldViewController: UIViewController, ...
- P神的SDFZ考试题 C题
探险[问题描述] 探险家小 T 好高兴! X 国要 ...