whacky关闭和ajax问题

时间:2015-01-25 03:28:54

标签: javascript jquery ajax

我对我的代码感到非常困惑。让我展示一下它的样子:

$(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事件。我希望这有助于某人。

2 个答案:

答案 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块之外声明它。