js中ajax的异步性
最近项目里遇到ajax异步性的问题,简化后的代码如下:
function ajaxGetEvents(calendarView, time) {
var year = time.getFullYear();
var month = time.getMonth() + < ? "" + (time.getMonth() + ) : time.getMonth() + ;
var day = time.getDate() < ? "" + time.getDate() : time.getDate();
var timeStr = year + "-" + month + "-" + day;
var ajaxData = {
search_monthNum : timeStr;
};
var ajaxUrl = localStorage.getItem("globalUrl") + 'trip/sheduleInfo!monthList.action';
var eventsData;
$.ajax( {
type : 'post',
dataType : 'json',
url : ajaxUrl,
data : ajaxData,
async: false,//此处设置ajax为同步请求
success : function(data) {
if (data.retCode == '') {
eventsData = data.returnData;
} else {
console.log(data.message);
}
},
error : function() {
console.log('ajax error in calendar.js');
}
});
return eventsData;
}
这个函数试图将ajax获取到的数据存储到eventsData中,然后返回。
这里主要要注意的是注释处,如果不将这个请求设为同步请求的话,这个返回的数据永远都会是空的。
异步的ajax是非阻塞的,success回调函数只在数据返回后才开始执行,而在此之前,程序会继续运行,执行return语句,那么被返回的eventsData永远是空的。
而同步请求是阻塞的,将这个函数中的请求设为同步则可以解决问题,代价是执行这个函数时可能会需要等待一段时间,时间的长短自然是看响应的速度了。
此外,类似的还有html5中的定位方法geolocation,看下面代码:
$(function(){
var lat, lng;
getCurrPosition();
$('#position').html("lat = " + lat + ' lng = ' + lng);
function getCurrPosition(){
if(navigator.geolocation){
navigator.geolocation.getCurrentPosition(getPositionSuccess, getPositionError);
}else{
alert("您的浏览器不支持Geolocation!");
}
}
function getPositionSuccess(position) {
lat = position.coords.latitude;
lng = position.coords.longitude;
}
function getPositionError(error){
switch (error.code) {
case error.TIMEOUT:
alert("连接超时,请重试");
break;
case error.PERMISSION_DENIED:
alert("您拒绝了使用位置共享服务,查询已取消");
break;
case error.POSITION_UNAVAILABLE:
alert("位置信息不可用");
break;
}
}
});
geolocation中的getCurrentPosition和watchPosition也都是异步的方法,像这个程序试图显示坐标信息的做法也是不可行的,lat和lng会一直为空。
而这里就没办法像ajax一样设为同步了,可行的做法应该是将进行显示的语句$("#position").html()放在getPositionSuccess函数中。
js中ajax的异步性的更多相关文章
- js中ajax连接服务器open函数的另外两个默认参数get请求和默认异步(open的post方式send函数带参数)(post请求和get请求区别:get:快、简单 post:安全,量大,不缓存)(服务器同步和异步区别:同步:等待服务器响应当中浏览器不能做别的事情)(ajax和jquery一起用的)
js中ajax连接服务器open函数的另外两个默认参数get请求和默认异步(open的post方式send函数带参数)(post请求和get请求区别:get:快.简单 post:安全,量大,不缓存)( ...
- 表单验证--通过原生js模仿ajax的异步交互
今天给大家带来个福利,我也是刚刚学习的很实用的一个东西,通过原生js模仿ajax的异步交互. 我的博客只是给那些新手看的大神勿喷,写的不好可留言,请指出. 因为当初自己学的时候一个问题不会找人问,知道 ...
- prototype.js 和 jQuery.js中 ajax 的使用
这次还是prototype.js 和 jQuery.js冲突的问题,前面说到过解决办法http://www.cnblogs.com/Joanna-Yan/p/4836252.html,以及上网说的大部 ...
- js中ajax如何解决跨域请求
js中ajax如何解决跨域请求,在讲这个问题之前先解释几个名词 1.跨域请求 所有的浏览器都是同源策略,这个策略能保证页面脚本资源和cookie安全 ,浏览器隔离了来自不同源的请求,防上跨域不安全的操 ...
- js中ajax异步问题
1.JS的执行顺序问题 浏览器是按照从上到下的顺序解析页面,因此正常情况下,JavaScript脚本的执行顺序也是从上到下的,即页面上先出现的代码或先被引入的代码总是被先执行,即使是允许并行下载Jav ...
- JS中的同步异步问题
<script> /* * JS 是单线程 * 同步 异步 * 常见的异步 * 1.定时器 * 2.事件绑定 * 3.ajax请求(一般的都是异步) * 4.回调函数也可以理解成 异步 * ...
- JS中的同步异步编程
首先我们先看看同步与异步的定义,及浏览器的执行机制,方便我们更好地理解同步异步编程. 浏览器是多线程的,JS是单线程的(浏览器只分配一个线程来执行JS) 进程大线程小:一个进程中包含多个线程,例如 ...
- JS中同步和异步
首先,我们要知道,JavaScript的本质是一门浏览器脚本语言,在执行的时候是一行一行的执行,只有前面的代码执行完了才会执行后面的代码.JS是单线程语言指的就是这个意思. 同步和异步其实在进行任务执 ...
- js中ajax异步导致的一些问题
问题1:ajax默认是异步,所以在ajax中对外面定义的变量赋值,不能正确赋值 $("form").submit( var flag; $.ajax({ type: 'GET', ...
随机推荐
- 基本控件文档-UIButton属性---iOS-Apple苹果官方文档翻译
本系列所有开发文档翻译链接地址:iOS7开发-Apple苹果iPhone开发Xcode官方文档翻译PDF下载地址 //转载请注明出处--本文永久链接:http://www.cnblogs.com/Ch ...
- 暑假集训——cf热身赛部分题有感加其题解
刚刚开始集训,集训队队长暂时还没有拉专题,而是拉了部分codeforces上过题人数在2000左右的题组成了一场热身赛(其实就是一场练习),花了一天时间终于把它刷完了,其中很多题让我学到了很多骚操作, ...
- poj 1298 The Hardest Problem Ever
题目链接:http://poj.org/problem?id=1298 题目大意:按照所给的顺序要求将输入的字符串进行排列. #include <iostream> #include &l ...
- css控制文字换行
1.word-wrap 设置为break-word时,文本中的长单词或url可以换行 <p style="width:100px;word-wrap:break-word;border ...
- mysql not null default / default
not null default 说明不能是NULL, 并设置默认值 default 设置默认值 , 但值也可能是NULL mysql> create table test (id int, n ...
- JavaScript match() 方法
match() 方法可在字符串内检索指定的值,或找到一个或多个正则表达式的匹配. 该方法类似 indexOf() 和 lastIndexOf(),但是它返回指定的值,而不是字符串的位置. var st ...
- bootstrap-select属性
# 参考:https://blog.csdn.net/zxl_langya/article/details/79247307 # bootstrap-select属性: <select mult ...
- centos7安装libvirt支持xen
另外还有一个非常棒的用法 假如我要执行iostat这个命令来查看CPU与存储设备状态,可是执行却发现没有这个命令 于是执行yum install iostat,结果说找不到该软件,使用下面的办法可以解 ...
- skb管理函数之skb_clone、pskb_copy、skb_copy
skb_clone--只复制skb描述符本身,如果只修改skb描述符则使用该函数克隆: pskb_copy--复制skb描述符+线性数据区域(包括skb_shared_info),如果需要修改描述符以 ...
- linux 下多版本gcc 共存问题
linux 下多版本gcc 共存问题 http://blog.csdn.net/isfirst/article/details/42296583 参考 http://blog.csdn.net/chi ...