我有一个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;
}
});
}
}
答案 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
}
});
}
});
});
听起来怎么样?