未捕获的 TypeError: $.ajax(...).success 不是一个函数。

50

我是jQuery新手,正在使用一份有点老的关于node.js的教程,其中使用了以下片段:

$(function () {    
    var roomId;

    $.ajax({
        type: "GET",
        url: "/api/rooms"
    }).success(function (rooms) { 
        roomId = rooms[0].id;
        getMessages();
        $.each(rooms, function (key, room) {
            var a = '<a href="#" data-room-id="' + room.id + '" class="room list-group-item">' + room.name + '</a>';
            $("#rooms").append(a);
        });

    });

    [...]       

});

然而我遇到了这个错误

未捕获的 TypeError: $.ajax(...).success 不是一个函数

位于}).success(function (rooms) {

我想知道可能出了什么问题?


2
你正在寻找 done()。http://api.jquery.com/deferred.done/ - Jason P
1
好的。我已经用“完成”替代了所有的“成功”,错误消失了。感谢你的建议! - Karlom
3个回答

58

调用ajax应该像这样:

$.ajax({
    type: "GET",
    url: "/api/rooms",
    success: function (rooms) { 

    }
});

不要对成功函数进行方法链,它是字典参数中的一个条目。


2
你可以链接成功函数调用,但需要使用在 https://jsfiddle.net/f7h8heb5/ 示例中展示的 .done()。同时,你也可以像你的示例一样在 ajax 调用中添加 success 选项。 - MugiwaraUK
3
在jQuery 1.8中,jqXHR对象(由$.ajax返回)的success被替换为done,error被替换为fail,complete被替换为always。 - Karlom

42

你的代码是正确的,没有问题。

但你可能包含了不允许使用.success()方法的新版jquery库。

如果要使用更新版本的jquery,请使用:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>

<script>
    $.ajax({
        type: "GET",
        url: "/api/rooms",
        success: function (rooms) {

        }
    });
</script>

如果您使用的是旧版本 jQuery,.success() 方法将可以正常运行。

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>

<script>
    $.ajax({

        url: "/api/rooms",
        method: "GET",
        data: {'datavar': datavalue}

    }).success(function (rooms) {

        console.log("successfully run ajax request..." + rooms);

    }).done(function () {

        console.log("I am from done function");

    }).fail(function () {

        console.log("I am from fail function.");

    }).always(function () {

        console.log("I am from always function");

    });
</script>

22
根据文档,jQuery 3.0已删除jqXHR.success()jqXHR.error()jqXHR.complete()回调方法。可以使用jqXHR.done()jqXHR.fail()jqXHR.always()替代。

这些方法最初作为选项回调函数被添加到jQuery的$.ajax中,像这样使用:

$.ajax({
    url      : 'mypage.php',
    success  : function() { ... },
    error    : function() { ... },
    complete : function() { ... }
});

然而,由于用户之间的一些混淆,后来也出现了具有相同名称的可链接方法。
$.ajax().success(  function() { ... })
        .error(    function() { ... })
        .complete( function() { ... })

自jQuery 1.8以来,这些方法已被弃用,并在jQuery 3.0中完全删除,因为使用了Deferred对象,后来是promises。 jqXHR.success()jqXHR.error()jqXHR.complete()被可链接的jqXHR.done()jqXHR.fail()jqXHR.always()方法所取代,选项回调目前仍可用。
截至jQuery 3.0,jQuery的Deferred对象也符合Promise/A+标准,这意味着它们是"thenable",也可以与then()一起使用。
$.ajax("/status").then(function(data) {

}).catch(function(error) {

});

2
就我个人而言,这是最好的答案。感谢您的完整回答。 - OJisBad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接