是否可以使用jQuery $ .when和布尔标志?

时间:2012-11-04 09:38:39

标签: javascript jquery synchronization

我有一个ajax调用,当且仅当特定标志设置在代码中的其他位置时才应该执行。

我无法直接在设置标志的函数中进行此调用,因为每次设置标志时我都不需要进行此调用。

这有点难以解释所以我能想到的最好的例子是:

只有当她在奶奶的家里时,狼才可以吃红帽。 然而,不是每次她来这个房子,都有一只狼来吃她。每当她来到这里,狼来到这里时,狼就会吃掉她。

我想知道,我可以为此目的使用$ .when(theFlag)吗?

var theRedHatIsHere = false;

function waitForRedHat()
{
.....
   theRedHatIsHere = true;
}

function wolfIsHungry(link)
{
   $.when(theRedHatIsHere)
   {
       $.ajax({
                type: "POST",
                url: "php/eatredhat.php?",
                data: ddd,
                async: false,
                success: function(msg){
                        console.log( "Eaten" );
                        window.location.href = link;
                }
        });                         
   }
}

3 个答案:

答案 0 :(得分:2)

var theRedHatIsHere = $.Deferred();

function waitForRedHat()
{
.....
   theRedHatIsHere.resolve();
}

function wolfIsHungry(link)
{
   $.when(theRedHatIsHere).then(function() {
       $.ajax({
                type: "POST",
                url: "php/eatredhat.php?",
                data: ddd,
                async: false,
                success: function(msg){
                        console.log( "Eaten" );
                        window.location.href = link;
                }
        });                         
   });
}

这里的一个缺点是你只能触发一次请求。

答案 1 :(得分:2)

使用自定义事件或发布/订阅模式而不是弯曲$ .when来做一些不应该做的事情。这是一个众所周知的模式,它有助于解耦您的组件,并且您具有灵活性,例如拥有多个订阅者,在某个时刻停止收听事件或仅对其做出反应。

使用jQuery.on订阅自定义事件

$(document).on('WolfIsHome', function(){
   $(document).on('WolfGotHungry', function(){
       $(document).on('RedHatArrived', function()
            $.ajax({
                type: "POST",
                url: "php/eatredhat.php?",
                data: ddd,
                async: false,
                success: function(msg){
                        console.log( "Eaten" );
                        window.location.href = link;
                }
            });
      }
  });
});
只要狼饿了,而不是设置那个布尔值只是提高那个自定义事件:

$(document).trigger("WolfIsHome"); // trigger in your logic when the wolf is home

$(document).trigger("WolfGotHungry"); //trigger wolfhungry which will register a subscriber to RedHat arrival event

//and somewhere else in the code
// if RedHatArrived and Wolf is not hungry then nothing will happen 
// because there won't be registered subscribers to her arrival
$(document).trigger("RedHatArrived"); 

答案 2 :(得分:0)

你可以在这里做些什么。您可以将其保存在输入元素中,而不是使用theRedHatIsHere的全局值。与<input type="hidden" id="theRedHatIsHere" value="0"/>

一样

现在更新此值后,触发一个事件。您可以将其绑定为:

$(function () {
    $('#theRedHatIsHere').on("change", function () {
        if ($(this).val() == 1 && wolfIsHungry == 1) {
            $.ajax({
                type: "POST",
                url: "php/eatredhat.php?",
                data: ddd,
                async: false,
                success: function (msg) {
                    console.log("Eaten");
                    window.location.href = link; // dont know where this link is being sent from
                }
            });
        }
    });
});

听起来怎么样?