1

我有一个 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;
                }
        });                         
   }
}
4

3 回答 3

3

使用自定义事件或发布/订阅模式而不是弯曲 $.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"); 
于 2012-11-04T10:26:11.150 回答
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;
                }
        });                         
   });
}

这里的缺点之一是您只能触发一次请求。

于 2012-11-04T09:59:28.693 回答
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
                }
            });
        }
    });
});

听起来怎么样?

于 2012-11-04T09:52:24.797 回答