博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
js中ajax的异步性
阅读量:5117 次
发布时间:2019-06-13

本文共 2302 字,大约阅读时间需要 7 分钟。

最近项目里遇到ajax异步性的问题,简化后的代码如下:

function ajaxGetEvents(calendarView, time) {    var year = time.getFullYear();    var month = time.getMonth() + 1 < 10 ? "0" + (time.getMonth() + 1) : time.getMonth() + 1;    var day = time.getDate() < 10 ? "0" + 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 == '1') {                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函数中。

转载于:https://www.cnblogs.com/caiminfeng/p/4706056.html

你可能感兴趣的文章
字符串处理
查看>>
HtmlUnitDriver 网页内容动态抓取
查看>>
ad logon hour
查看>>
获得进程可执行文件的路径: GetModuleFileNameEx, GetProcessImageFileName, QueryFullProcessImageName...
查看>>
证件照(1寸2寸)拍摄处理知识汇总
查看>>
罗马数字与阿拉伯数字转换
查看>>
Eclipse 反编译之 JadClipse
查看>>
Python入门-函数
查看>>
[HDU5727]Necklace(二分图最大匹配,枚举)
查看>>
距离公式汇总以及Python实现
查看>>
一道不知道哪里来的容斥题
查看>>
Blender Python UV 学习
查看>>
window添加右键菜单
查看>>
入手腾龙SP AF90mm MACRO
查看>>
Window7上搭建symfony开发环境(PEAR)
查看>>
Linux内核态、用户态简介与IntelCPU特权级别--Ring0-3
查看>>
第23月第24天 git命令 .git-credentials git rm --cached git stash clear
查看>>
java SE :标准输入/输出
查看>>
一些方便系统诊断的bash函数
查看>>
jquery中ajax返回值无法传递到上层函数
查看>>