Uncaught TypeError: $.ajax(...). Успех не является функцией

Я новичок в 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);
        });

    });

    [...]       

});

Однако я получаю эту ошибку

Uncaught TypeError: $.ajax(...). Успех не является функцией

at }).success(function (rooms) {

Мне интересно, что здесь может быть не так?

Ответ 1

Вызов ajax должен выглядеть так:

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

    }
});

Вы не применяете метод функции успеха, это одна из записей в словаре.

Ответ 2

Ваш код верен, с ним нет проблем

но вы можете включить новую библиотеку jquery, которая не позволяет использовать метод.success()

для более новой версии использования 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>

Ответ 3

Согласно документации

jqXHR.success() обратного вызова jqXHR.success(), jqXHR.error() и jqXHR.complete() удаляются с jQuery 3.0.

jqXHR.done() вы можете использовать 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 из-за использования объектов с отсрочкой, а затем и обещаний.

jqXHR.success(), jqXHR.error() и jqXHR.complete() перенаправлены с помощью методов jqXHR.done(), jqXHR.fail() и jqXHR.always(), связанных с jqXHR.always(), варианты обратных вызовов параметров по-прежнему доступны теперь.

Начиная с jQuery 3.0, jQuery Отложенные объекты также совместимы с Promise/A+, что означает, что они "затемны" и могут использоваться с then()

$.ajax("/status").then(function(data) {

}).catch(function(error) {

});