在jQuery中如何等待变量的特定值

时间:2016-11-17 21:19:56

标签: javascript jquery ajax

我有一个变量

var IsAjaxing;

每次在页面上触发ajax时,我都将其设置为true。然后在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);
});

3 个答案:

答案 0 :(得分: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();

每次完成ajax运行时:

IsAjaxing.Off();

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

答案 1 :(得分: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()函数用于停止检查。

答案 2 :(得分:0)

  

我正在构建一个SafeAjaxing事件,所以只有当页面不是ajax时才能完成工作。

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

  • ajaxStop" 如果启动了Ajax请求并且当前没有其他Ajax请求正在运行,则会触发此事件。"
  • std::unique_ptr" 如果没有更多的Ajax请求被处理,则会触发此全局事件。"