【问题标题】:AJAX success failure callback not workingAJAX 成功失败回调不起作用
【发布时间】:2016-12-07 19:07:25
【问题描述】:

我有一张桌子和一个删除按钮。基本上我想要做的是当我点击删除按钮时,它会向我们的服务器发送一个删除请求并更新数据库。如果成功,它将从表中删除该行。

Config.js

var SiteConfigProxy = function () {
"use strict";

var getSiteConfig = Config.apiUrl + "/configs/site/{siteId}";
var addDevice = Config.apiUrl + "/configs/device/{deviceId}";

var delete1 = function (url, data, done, fail){
    $.ajax({
        type: "DELETE",
        url: url,
        data: JSON.stringify(data),
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function (data) {
            if (typeof (done) === 'function') done(data);
        },
        failure: function (data) {
            if (typeof (fail) === 'function') fail(data);
        }
    });
};

return {
    deleteDeviceConfig: function (deviceId, data, done, fail){
        delete1(addDevice.replace("{deviceId}", deviceId), data, done, fail);
    }
};
} ();

siteconfig.js

        configTable.on("click", ".delete", function (event) {
        event.preventDefault();
        if (confirm("Are you sure to delete this row?")) {
            var tableRow = $(this).parents("tr")[0];
            var data = {
                siteId: tableData.fnGetData(tableRow)[1],
                hostname: tableData.fnGetData(tableRow)[2]
            };

            SiteConfigProxy.deleteDeviceConfig(tableData.fnGetData(tableRow)[0], data,
                function(data){
                    tableData.fnDeleteRow(tableRow);
                    console.log("delete succeeded");
                },
                function(data){
                    console.log("delete failed");
                }
            );
        }
    });

现在每次单击按钮时,它都不会删除该行,控制台也不会记录该语句。我只是想知道为什么成功和失败回调不起作用。

非常感谢

【问题讨论】:

  • 控制台日志有错误吗?如果您检查浏览器的网络选项卡,您是否看到它正在发送 AJAX 请求?
  • @Barmar 控制台日志中没有错误。 ajax 请求实际上已发送,我可以看到该行已在 db 中删除
  • 您在网络选项卡中看到 JSON 响应了吗?
  • @Barmar 我没有看到 JSON 响应嗯
  • 您在文档中的哪个位置看到failure 选项?

标签: javascript jquery ajax callback


【解决方案1】:

由于您的服务器脚本没有返回有效的 JSON 响应,它应该调用失败回调(因为尝试将响应解析为 JSON 失败)。但该选项的正确名称是error:,而不是failure:。所以改成:

    error: function (data) {
        if (typeof (fail) === 'function') fail(data);
    }

如果服务器不应该发回 JSON 响应,请忽略 dataType: 选项,它不会尝试解析它。

【讨论】:

  • 现在我可以看到控制台日志“删除失败”,但是如果请求正在服务器端处理并在数据库上更新,为什么它会返回错误?
  • 因为服务器没有发回正确的 JSON。由于您指定了dataType: 'json',因此解析响应时出错会导致调用error: 处理程序。
  • 好吧,我明白为什么了。有没有办法为响应指定不同的数据类型?因为我的响应不是 json 类型。或者我可以丢弃响应数据吗?
  • 只要省略dataType:选项,它将根据响应中的Content-type:标头默认。
猜你喜欢
  • 1970-01-01
  • 2014-08-13
  • 1970-01-01
  • 1970-01-01
  • 2014-07-08
  • 2021-01-18
  • 2016-04-29
  • 1970-01-01
  • 2017-06-11
相关资源
最近更新 更多