【问题标题】:$.ajax making API call twice though it's getting called once only$.ajax 调用 API 两次,虽然它只被调用一次
【发布时间】:2016-03-02 06:11:38
【问题描述】:

我遇到了奇怪的问题。我正在实施一个 SPA。我在这里使用 MVC、Sammy 路由器,需要 JS 和 Knockout。

这是一个文件,我在其中定义了调用 API 的函数。

define(['jquery', 'UIBlock'], function ($) {
    var GlobalParameters = function () {
        this.Parameters;
        this.APIEndPoint = 'http://localhost:24774/API/';
    };

    GlobalParameters.prototype.AjaxCallToServer = function (url, requestType, data, successCallback) {
        $.blockUI();
        $.ajax({
            url: this.APIEndPoint + url,
            data: data,
            contentType: "application/json",
            type: requestType,
            statusCode: {
                500: function () {
                    $('#info').html('<p>An error has occurred while processing your request.</p>');
                    $('#info').show();
                },
                409: function (xhr, ajaxOptions, thrownError) {
                    var message = JSON.parse(xhr.responseText).ExceptionMessage;
                    $('#info').html(message);
                    $('#info').show();
                },
                204: function (data) {
                    $('#info').html('<p>No data found.</p>');
                    $('#info').show();
                }
            },
            dataType: 'json',
            success: successCallback,
            complete: function () {
                $.unblockUI();
                setTimeout(function () {
                    $('#info').hide();
                    $('#info').html("");
                }, 3000);
            }
        });
    };

    return {
        GlobalParameters: GlobalParameters
    }
});

我添加了调试器,发现它只被调用一次。

这是来自 Google chrome 开发者工具的网络跟踪。

这是每个请求的详细信息。

【问题讨论】:

    标签: jquery ajax asp.net-mvc requirejs sammy.js


    【解决方案1】:

    这是正常行为,称为预检请求。与简单请求不同,“预检”请求首先向另一个域上的资源发送一个 HTTP OPTIONS 请求标头,以确定实际请求是否可以安全发送

    查看this了解更多详情。

    【讨论】:

    • 感谢 Sanjay 的回复,我的问题是它调用了 Success 回调两次。有什么方法可以从响应中识别是预检响应还是实际响应?
    • @alok_dida 那是不可能的。浏览器本身发出 OPTIONS 请求,它与 ajax 成功无关......只有当它被拒绝然后它进入 ajax 错误时
    • @charlietfl .. 问题是,如果你看到我的 AJAX 调用代码,我已经专门针对不同的状态代码编写了代码。在我的 PUT API 调用期间,我得到了两个不同的响应。一个是 200(预检请求),另一个是 409(实际请求)。因此,我可以在屏幕上看到两条消息。有什么方法可以避免或识别响应来自预检请求还是实际请求?
    • @alok_dida 我怀疑您正在对该 OPTIONS 请求运行服务器端逻辑,而不是检查请求方法。该请求本身不会触发任何 ajax 成功处理程序。 $.ajax对此一无所知
    猜你喜欢
    • 1970-01-01
    • 2016-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-04
    • 2019-08-23
    相关资源
    最近更新 更多