我对我的代码感到非常困惑。让我展示一下它的样子:
$(document).ready(function ($) {
var customer_exists = false;
$.get(window.additional_parameters.customer_exists_url, "json")
.done(function () {
customer_exists = true;
})
.always(function () {
// Don't make request to buy clickable until we know if the customer exists
$('#request-to-buy').on('click', function(e) {
request_to_buy(customer_exists);
});
});
function request_to_buy(customer_exists) {
response = can_request_to_buy();
response.done(function (response) {
if (customer_exists) {
// Actually create the request on the server
$.post(window.additional_parameters.request_to_buy_url,
{'ticket_id': window.additional_parameters.ticket_id},
"json")
.done(function (response) {
request_to_buy_success(response);
})
.fail(function () {
var message = handle_ajax_response(response);
show_ajax_message(message);
});
} else {
show_pre_stripe_popup();
}
})
.fail(function (response) {
var error_message = handle_ajax_response(response);
show_ajax_message(error_message, 'danger');
});
}
$(document).ready()
,我们设置了一个名为customer_exists的变量。此变量随后引导代码的路径,这非常重要。如果$.get
AJAX请求成功,则为true,否则保持默认值false。在AJAX响应之后,我们将点击事件附加到“#request-to-buy”。我的目标是创建一个闭包并传入刚刚设置的customer_exists的值。这不会发生。
很长一段时间(我有一次或两次正常工作),当我在调试器中检查request_to_buy时,我可以看到customer_exists是一个jQuery click事件。为什么???它不应该从创建函数的周围范围中获取customer_exists的值吗?谁能解释一下这里发生了什么?
谢谢
编辑:这里有更多信息,描述它有时如何运作...... 我第一次点击'#request-to-buy',处理程序是
function(e) {
request_to_buy(customer_exists);
}
这就是我们所期望的。 e包含click事件,customer_exists保留了它的值,并且一切都在request_to_buy中运行。
每次在第一个之后点击'#request-to-buy',而不是调用上面的函数,直接调用request_to_buy,而不是在第一个参数中传入customer_exists,而是传入click事件。我希望这有助于某人。
答案 0 :(得分:1)
您应该能够在不需要繁琐的外部变量customer_exists
的情况下执行此操作。
例如:
$(document).ready(function ($) {
$.get(window.additional_parameters.customer_exists_url, "json").then(function () {
// Don't make request to buy clickable until we know if the customer exists
$('#request-to-buy').on('click', request_to_buy);
}, function() {
$('#request-to-buy').on('click', show_pre_stripe_popup);
});
function request_to_buy(e) {
e.preventDefault();
can_request_to_buy().then(function(response) {
// Actually create the request on the server
$.post(window.additional_parameters.request_to_buy_url, {
'ticket_id': window.additional_parameters.ticket_id
}, "json").then(request_to_buy_success, function() {
show_ajax_message(handle_ajax_response(response));
});
}).fail(function(response) {
show_ajax_message(handle_ajax_response(response), 'danger');
});
}
}
show_pre_stripe_popup
也会传递一个事件,你也可能需要e.preventDefault();
。
您需要检查是否将正确的参数传递给各种错误处理程序。我无法验证它们。
如果它仍然不起作用,那么您必须怀疑问题中未包含的其他代码,例如函数can_request_to_buy()
。
答案 1 :(得分:-1)
var customer_exists = false;
在ready块之外声明它。