2016-08-19 11 views
17

Jestem nowy jQuery i przy użyciu trochę stary tutorial node.js że używa tego fragmentu.

$(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); 
     }); 

    }); 

    [...]  

}); 

jednak uzyskać to błąd

Uncaught TypeError: $.ajax(...).success is not a function

na }).success(function (rooms) {

Zastanawiam się co może być nie tak tutaj?

+0

Szukacie 'zrobić()'. http://api.jquery.com/deferred.done/ –

+1

Dobrze. Wymieniłem wszystkie 'success' na' done' i błąd zniknął. Dzięki za wskazówkę! – Karlom

Odpowiedz

23

Wywołanie AJAX powinna wyglądać następująco:

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

    } 
}); 

nie zrobić łańcuch metody funkcja sukces, jest to jeden z wpisów w słowniku argument.

+1

Możesz połączyć wywołanie funkcji success, ale musisz użyć opcji .done() pokazanej w przykładzie @ https://jsfiddle.net/f7h8heb5/, ale dodajesz także opcję success w wywołaniu ajax, jak pokazuje przykład jako dobrze – MugiwaraUK

+2

W prawo, w jQuery 1.8 na obiekcie jqXHR (zwracany przez $.ajax) sukces jest zastępowany zakończonym, błąd zakończony niepowodzeniem i zawsze zakończony. http://stackoverflow.com/a/8847853/5774375 – Karlom

15

Twój kod jest poprawny nie ma problemu z tym

ale może być wy w tym nowej biblioteki jQuery, która nie pozwala .success (metoda

) do nowszej wersji użyć 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> 

a jeśli używasz starego jQuery metoda .success() będzie działać bez problemu

<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

Według documentation

The jqXHR.success() , jqXHR.error() , and jqXHR.complete() callback methods are removed as of jQuery 3.0.

You can use jqXHR.done() , jqXHR.fail() , and jqXHR.always() instead.


Metody te zostały pierwotnie dodanego do jQuery $.ajax jako opcje wywołania zwrotne, które mają być używane jak to

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

Jednakże, ze względu na pewne zamieszanie wśród użytkowników, oni później również towarzyszyły metody łańcuchowe o tych samych nazwach:

$.ajax().success( function() { ... }) 
     .error( function() { ... }) 
     .complete(function() { ... }) 

Metody te zostały uznane za przestarzałe od wersji jQuery 1.8 i całkowicie usunięte w jQuery 3.0 z powodu użycia obiektów Odroczonych, a później obietnic.

jqXHR.success(), jqXHR.error() i jqXHR.complete() są superseeded przez chainable jqXHR.done(), jqXHR.fail() i jqXHR.always() metod, możliwości wywołania zwrotne są nadal dostępne teraz.

Jak jQuery 3.0, Odroczone obiekty jQuery za are also Promise/A+ compliant, co oznacza, że ​​są "thenable" i może być używany z then() oraz

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

}).catch(function(error) { 

});