我试图在我的网页上实施以下方案:
next
按钮我检查了类似同步问题的解决方案:
但无法真正适应我的情况。
每次用户按下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
语句是在success
请求ajax
之前执行的。{/ p >
我该如何解决?
注意1:我不能简单地将if
语句移到success
函数中,因为即使flag_instructions_pressed
设置为{之后仍然应该执行该语句{1}}。 true
只是初始化为flag_instructions_pressed
的标记,在false
请求执行后设置为true
。这可以防止在第二次执行代码时再次发生请求。
注意2:显然,如果我在ajax
语句之前发出警报(或只是暂停),一切正常。但我认为这是糟糕的编程习惯,并希望学习如何处理这种类型的同步问题。
答案 0 :(得分:1)
对此的一个解决方案是利用承诺。它们充当未来价值的占位符,您可以检查其未来价值&#34;多次:
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
});
}
答案 1 :(得分:1)
如何将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();
}