Javascript等待ajax成功后再执行代码
Javascript wait for ajax success before code execution
我正试图在我的网页上实现以下场景:
- 用户访问页面(请注意,用户具有唯一的ID)
- 用户必须执行任务,然后按下
next
按钮 - 当按下按钮时,我会在数据库中查找它是否是用户的第一次访问
- 如果是的话,他必须等60秒才能按下按钮,所以我提醒他
我检查了类似同步问题的解决方案:
- 如何等待ajax成功处理程序完成后再执行另一个
- 在使用jQuery运行代码之前等待AJAX调用
- JavaScript同步选项
但无法使它们真正适应我的情况。
每次用户按下next
按钮时,都会执行以下代码段。
// get timing for instruction reading
var currentTime = new Date().getTime();
totalTime = currentTime - startTime;
console.debug("Time: " + totalTime);
if (flag_instructions_pressed == false){
$.ajax({
url: "/IsNewUser/",
type: "POST",
contentType: "application/json",
data: JSON.stringify({
"_user_id": _user_id,
}),
dataType: "text",
success: function( returned_data ) {
_user_exp = parseInt(returned_data);
flag_instructions_pressed = true;
}
});
}
if ( totalTime < 60000 && _user_exp == 0) {
alert("You have to wait 60 seconds");
return;
}
ajax
请求将返回一个字符串,其中包含有问题的用户以前的访问次数,并且对于该会话应该只执行一次(因为它将用户添加到数据库中)。结果存储在全局变量_user_exp
中
我有以下问题:
即使用户多次访问该页面,由于
if
语句是在ajax
请求的success
函数之前执行的,因此仍会向他显示警报。
我该如何解决?
注意1:我不能简单地将if
语句移动到success
函数中,因为即使在flag_instructions_pressed
设置为true
之后,它仍然应该执行。flag_instructions_pressed
只是在执行ajax
请求之后被设置为true
的初始化为false
的标志。这样可以防止在第二次执行代码时再次发生请求。
注意2:显然,如果我在if
语句之前发出警报(或只是超时),一切都会正常工作。但我认为这是一种糟糕的编程实践,我想学习如何处理这种类型的同步问题。
一个解决方案是使用promise。它们充当未来值的占位符,您可以多次"检查其未来值":
var newUserCheck;
function nextButtonHandler() {
// get timing for instruction reading
var currentTime = new Date().getTime();
totalTime = currentTime - startTime;
console.debug("Time: " + totalTime);
if (!newUserCheck) {
newUserCheck = $.ajax({
url: "/IsNewUser/",
type: "POST",
contentType: "application/json",
data: JSON.stringify({
"_user_id": _user_id,
}),
dataType: "text"
}).then(function ( returned_data ) {
_user_exp = parseInt(returned_data);
return _user_exp;
});
}
newUserCheck.then(function (user_exp) {
if ( totalTime < 60000 && user_exp === 0 ) {
alert("You have to wait 60 seconds");
return;
}
// otherwise, complete the "next button procedure" here
});
}
如何将if语句转换为函数:
function testTime() {
if ( totalTime < 60000 && _user_exp == 0) {
alert("You have to wait 60 seconds");
return;
}
}
然后将另一个if语句转换为if/else,在else块(flag_instructions_pressed == true
)和ajax调用的成功函数(flag_instructions_pressed == false
)中调用此函数:
if (flag_instructions_pressed == false){
$.ajax({
url: "/IsNewUser/",
type: "POST",
contentType: "application/json",
data: JSON.stringify({
"_user_id": _user_id,
}),
dataType: "text",
success: function( returned_data ) {
_user_exp = parseInt(returned_data);
flag_instructions_pressed = true;
testTime();
}
});
} else {
testTime();
}
相关文章:
- 有没有一种方法可以通过只引用JavaScript来执行代码
- jQuery在类更改时执行代码
- 如果此代码运行,请执行代码
- Javascript等待ajax成功后再执行代码
- 如何在onclick事件执行代码时在ImageButton上设置加载gif
- php,如果我点击按钮程序重新加载页面,并且从不继续执行代码
- Javascript渲染.如何编写Javascript;t在函数调用结束之前继续执行代码
- 无法让 jQuery 以正确的顺序执行代码
- ReactJS:在带有 ajax 调用的 .map() 语句完成后执行代码
- 从一个文本框执行代码,并在另一个文本框中以 HTML 显示输出
- 自执行代码中的“this”
- 为什么Javascript不按顺序执行代码
- 如何在javascript中连续执行代码
- 加载所有图像后执行代码
- 按下多个按钮时执行代码
- 如何在检索到数据后使用drawCallback执行代码
- 等待promise解析后再执行代码
- jQuery没有为具有新id的新元素执行代码
- 如何在客户端Collection增长时立即反应性地执行代码
- 如何将变量表达式转换为可执行代码(而不是替换值)