Javascript加载函数是异步的
Javascript load functions asychronosuly
我正在获取地理位置。我遇到的问题是,地理定位需要几秒钟的时间才能做出响应。到那时,我的ajax已经在文档就绪时被调用,并且long/lat从未发布。如何确保在定位完成之前不会调用ajax?
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(showPosition);
} else {
//get it another way
//else
var Longitude = '0';
var Latitude = '0';
}
function showPosition(position) {
var Longitude = position.coords.longitude;
var Latitude = position.coords.latitude;
}
$.ajax({
url: 'activities.php?action=log-campaign-visit',
type: 'post',
data: {
DeviceID: session,
CampaignId: id,
User: userid,
IP: IP,
Agent1: agent1,
Referer1: referer1,
CouponId: couponId,
CampaignMedium: Cmedium,
CampaignSource: source1,
URL: fullUrl,
RedemptionCode: RedemptionCode,
Userlanguage: userLang,
ScreenWidth: screenWidth,
ScreenHeight: screenHeight,
ScreenOrientation: orientation,
Longitude: Longitude,
Latitude: Latitude
},
success: function (data) {
$('#RedemptionCode').html(data);
if (data == 'Success') {}
},
done: function () {
alert("done");
},
fail: function () {
alert("error");
},
always: function () {
alert("complete");
},
});
将ajax调用放入函数中;从呼叫
function showPosition
else
块- 并且在超时之后(用户可能没有注意到接受地理定位)
如果地理位置可用,则需要在地理位置回调完成后发送ajax请求
我已经将ajax请求移到了一个单独的方法中,因为它必须被调用两次,第一次在else部分,第二次在地理位置回调中
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(showPosition);
} else {
// get it another way
doAjax('0', '0')
}
function showPosition(position) {
var Longitude = position.coords.longitude;
var Latitude = position.coords.latitude;
doAjax(Latitude, Longitude)
}
function doAjax(Latitude, Longitude) {
$.ajax({
url : 'activities.php?action=log-campaign-visit',
type : 'post',
data : {
DeviceID : session,
CampaignId : id,
User : userid,
IP : IP,
Agent1 : agent1,
Referer1 : referer1,
CouponId : couponId,
CampaignMedium : Cmedium,
CampaignSource : source1,
URL : fullUrl,
RedemptionCode : RedemptionCode,
Userlanguage : userLang,
ScreenWidth : screenWidth,
ScreenHeight : screenHeight,
ScreenOrientation : orientation,
Longitude : Longitude,
Latitude : Latitude
},
success : function(data) {
$('#RedemptionCode').html(data);
if (data == 'Success') {
}
},
done : function() {
alert("done");
},
fail : function() {
alert("error");
},
always : function() {
alert("complete");
}
,
});
}
将Ajax调用移动到separate函数。然后在showPosition函数和第一个if的else部分中调用它。这样,它总是被调用,并等待地理定位完成
如果您可以检查地理位置是否不可能,并在这种情况下调用ajax调用,这也是一个好主意。
相关文章:
- 如何在异步函数中使用javascript对象
- Meteor:异步函数回调异常:onAfterAction
- 未调用jquery异步函数
- 使用来自不同异步函数的响应创建一个json对象
- 如何在异步函数中正确使用Promise.all()和then()
- 从异步函数返回值
- 如何按照承诺使用mocha/chai/chai测试ES7异步函数
- 如何在将Node异步函数转换为promise时使用Q库
- 如何在异步函数与Deferredjquery之间同步
- ng用异步函数模拟怪异行为
- 用mocha测试异步函数
- 用于异步函数中的循环和定时问题
- Node.js设计:多个异步函数使用作为闭包传递的函数写入数据库
- 嵌套异步函数未及时返回数据的问题
- 在异步函数中维护变量的状态
- 递归异步函数
- Bluebird promisifyAll不会创建整个异步函数集
- 递归调用异步函数
- 异步函数调用是否可以在两个同步语句之间完成
- 如何在nodejs中实现异步函数