2016-11-17 25 views
1

特定值我有一个变量在jQuery中如何等待可变

var IsAjaxing; 

我将它设置为true,每次一个AJAX是在页面上发射。然后当ajax完成时将它设置为false;

我建立一个SafeAjaxing事件,这样的工作只能做网页时不ajaxing:

// safe-ajaxing: Triggers when no ajax is running 
    $($fieldRenderPageDOM).on("safe-ajaxing", '.field-render', function(e, work) { 
     $.when({ IsAjaxing: false }).done(work); 
    }); 

这似乎并没有等待,工作总是立即调用。

它会被称为是这样的:

$fieldDOM.trigger("safe-ajaxing", function() { 
    $fieldDOM.trigger("do-work"); 
    $fieldDOM.trigger("do-some-more-work); 
}); 
+1

的可能的复制[在JavaScript中,当一个变量的值改变如何触发事件?(http://stackoverflow.com/questions/10638769/in-javascript -如何-触发事件时的变量值被更改) –

+0

不要等待值出现在变量中。相反,只需直接等待数据。 – Bergi

+0

不能。设计是事件驱动的,无法访问直接的Ajax调用。 – Bill

回答

1

你应该使用承诺用于这一目的:

var IsAjaxing = function(){ 
    var defer = $.Deferred().resolve(); 

    return { 
     On: function(){ 
      defer = $.Deferred(); 
     }, 
     Off: function(){ 
      defer.resolve(); 
     }, 
     Promise: function() { 
      return defer.promise(); 
     }, 
     IsOn: function() { 
      return defer.state() == "pending"; 
     }, 
     IsOff: function() { 
      return defer.state() != "pending"; 
     } 
    }; 
}(); 

然后您的活动将是:

// safe-ajaxing: Triggers when no ajax is running 
$($fieldRenderPageDOM).on("safe-ajaxing", '.field-render', function(e, work) { 
    $.when(IsAjaxing.Promise()).done(work); 
}); 

每次当你开始Ajax请求的运行时间:

IsAjaxing.On(); 

每当你完成阿贾克斯运行时:

IsAjaxing.Off(); 

要检查IsAjaxing的当前状态,请调用IsOn和IsOff函数。

+0

我如何判断IsAjaxing的状态?具体如何知道它是否是ajaxing? – Bill

+0

基于您的原始解决方案而努力工作! – Bill

0

这可能不是最好的方式,但它的工作原理。

你真的应该优化我写的代码,但这是为了让你开始。

var isAjaxing = false; 

var check = function(){ 
    if(isAjaxing){ 
    // do something 
    alert(); 

    // freeze the checking 
    // manual restart is required 
    clearInterval(interval); 
    } 
} 

var interval = setInterval(check, 10); 

// to demonstrate the variable change 
setInterval(function(){ 
    isAjaxing = true; 
}, 3000); 

此脚本检查该变量被每10毫秒变化。

注意:clearInterval()函数用于停止检查。

0

我正在构建一个SafeAjaxing事件,因此只有在页面不是ajaxing的时候才能完成工作。

不要自己建立这个。只需使用内置ajax events of jQuery,即

  • ajaxStart如果一个Ajax请求开始时触发此事件,并没有其他的Ajax请求正在运行。
  • ajaxStop这个全球事件被触发,如果有没有更多的Ajax请求正在处理中。