jQuery AJAX竞争条件

时间:2015-03-14 03:11:50

标签: javascript jquery ajax

我在SO上看过类似的问题,但不是我的问题。

我有类似

的东西
var x = 5;
if( some condition ){
    $.ajax({
        url:"...",
        success: function(response){
            x = response.x;
        }
    }
}
some other logic
use x variable

正在发生的事情是执行JS的线程在异步任务返回之前获取使用x的逻辑。

通常我会在成功函数中放置任何逻辑但我需要逻辑发生,无论条件是否满足并且我不想复制代码。有人有什么建议吗?我应该只是异步而不是假的吗?

谢谢!

3 个答案:

答案 0 :(得分:3)

async false将是一种方法,因为如果条件为真,你希望使用x返回的值。

您也可以使用承诺。

var x = 5;
var ajaxCall;
if(some condition) {
    ajaxCall = $.ajax({ 
        url: "...";
    });
}

function usingx(x) {
     //Add your logic
}

if(typeof(ajaxCall) === 'undefined') {
    usingx(x);      
} else {
    ajaxCall.done(function(data){
        usingx(data.x);
    });
}

要么是异步错误,要么在两种情况下调用该函数,一种情况是无需等待即可执行,另一种情况则需要等待。

更复杂的方法是等待Ajax完成然后运行该函数。

var x = 5;
var isCallMade = false;
if(some condition) {
    isCallMade = true;
    ajaxCall = $.ajax({ 
        url: "...";
    }).done(function(data){
        x = data.x;
    }).always(function(){
        isCallMade = false;
    });
}

function useX() {
    if(isCallMade) {
        setTimeout(useX, 100); //Wait for ajax call to finish
    } else {
        //logic using x
    }
}

答案 1 :(得分:1)

使用always回调。

if( some condition ){
    $.ajax({
        url:"...",
        success: function(){ // BTW, as of jQuery 1.8 this is referred to as "done"
          // Success specific code
        },
        always: function() {
          // Code that always executes regardless of success or failure
        }
    }
}

答案 2 :(得分:0)

如果Ajax失败,JQuery还会有一个fail()回调函数。我只是把逻辑放在两种情况下。 (抽象成一个函数) 看看这个问题。

jQuery: Handle fallback for failed AJAX Request

**修订

$ .ajax的complete()方法在ajax调用之后运行,无论如何。听起来很完美。 http://api.jquery.com/jquery.ajax/