Javascript在代码执行之前等待ajax成功

时间:2015-03-29 18:08:25

标签: javascript jquery ajax

我试图在我的网页上实施以下方案:

  1. 用户访问页面(请注意,用户具有唯一ID)
  2. 用户必须执行任务,然后按next按钮
  3. 按下按钮后,我会在数据库中查找是否是用户首次访问
  4. 如果是,他必须等待60秒才能按下按钮,所以我提醒他
  5. 我检查了类似同步问题的解决方案:

    但无法真正适应我的情况。

    每次用户按下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语句之前发出警报(或只是暂停),一切正常。但我认为这是糟糕的编程习惯,并希望学习如何处理这种类型的同步问题。

2 个答案:

答案 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();
}