$ http.get (…) .success không phải là một hàm


108

tôi có mã này:

app.controller('MainCtrl', function ($scope, $http){
  $http.get('api/url-api')
    .success(function (data, status, headers, config){
     }
}

Trong môi trường cục bộ của tôi, hoạt động tốt, nhưng trong máy chủ, trả về lỗi này:

TypeError: $ http.get (...). Thành công không phải là một chức năng

Bất kỳ ý tưởng? Cảm ơn


1
phiên bản nào trên envm cục bộ và trên máy chủ? btw, $ http.get trở HttpPromise, vì vậy bạn cần sử dụng thì thay vào đó
Grundy

bạn đã kiểm tra xem tất cả các javascrip của bạn đều tải trong môi trường máy chủ chưa?
bansi

7
then()không phảisuccess()
Patrick Evans

10
Các .successcú pháp là đúng lên đến v1.4.3 góc. Xem các tài liệu cũ tại đây: code.angularjs.org/1.4.3/docs/api/ng/service/$http
Mihai MATEI

5
và chính thức bị xóa trong v.1.6
adamdport

Câu trả lời:


212

Các .successcú pháp là đúng lên đến v1.4.3 góc.

Đối với các phiên bản lên đến Angular v.1.6, bạn phải sử dụng thenphương pháp. Các then()phương pháp hai đối số: một successvà một errorcallback sẽ được gọi với một đối tượng phản ứng.

Sử dụng then()phương thức này, hãy đính kèm một callbackhàm vào giá trị trả về promise.

Một cái gì đó như thế này:

app.controller('MainCtrl', function ($scope, $http){
   $http({
      method: 'GET',
      url: 'api/url-api'
   }).then(function (response){

   },function (error){

   });
}

Xem tài liệu tham khảo tại đây.

Shortcut các phương pháp cũng có sẵn.

$http.get('api/url-api').then(successCallback, errorCallback);

function successCallback(response){
    //success code
}
function errorCallback(error){
    //error code
}

Dữ liệu bạn nhận được từ phản hồi dự kiến ​​sẽ ở JSONđịnh dạng. JSON là một cách tuyệt vời để vận chuyển dữ liệu và nó rất dễ sử dụng trong AngularJS

Sự khác biệt chính giữa 2 là .then()cuộc gọi trả về a promise(được giải quyết với giá trị trả về từ a callback) trong khi đó .success()là cách đăng ký truyền thống hơn callbacksvà không trả về a promise.


Tôi đã thử với .then và hoạt động ổn, cảm ơn Alexandru-Ionut Mihai
Alejo Ribes

1
.success.thenlấy các thông số khác nhau, giải thích cho điều đó
Max Koretskyi

Nếu viết lại mã hiện có, có thể dễ dàng trình bày hai đối số-hàm (thành công, lỗi) được đề cập ở trên trong dòng chứ không phải riêng biệt như trong ví dụ.
Tony Sepia,

"$ resource (...). get (...). then không phải là một hàm" ... Tại sao angleJS lại rất khó hiểu khi nói đến tính nhất quán?
Hobbamok 27/09/18

8

Điều này có thể là thừa nhưng câu trả lời được bình chọn nhiều nhất ở trên đã nói .then(function (success)và điều đó không phù hợp với tôi kể từ phiên bản Angular 1.5.8. Thay vào đó, sử dụng responsethì bên trong khối response.datađã cho tôi dữ liệu json mà tôi đang tìm kiếm.

$http({
    method: 'get', 
    url: 'data/data.json'
}).then(function (response) {
    console.log(response, 'res');
    data = response.data;
},function (error){
    console.log(error, 'can not get data.');
});

ý tôi là ... bạn đã thử success.datachưa? tên tham số không quan trọng trong trường hợp này.
Kevin B

Mã của tôi hoạt động. Khi tôi làm theo câu trả lời trên, tôi đã bị mắc kẹt. Nó cũng là một câu trả lời với một cách thực sự lấy dữ liệu và đăng nhập nó vào bảng điều khiển của bạn. Điều này có thể chỉ cho các nhà phát triển cách kiểm tra dữ liệu của họ trong trình duyệt của họ. Tôi đã bị dẫn đến đây bởi cùng một lỗi chính xác trong tiêu đề câu hỏi.
Ian Poston Framer

mã cũ $http.get('data/data.json').success(function(data) { data = data;}với câu trả lời của tôi, một nhà phát triển bây giờ biết rằng nó data.datakhông thể tự lấy dữ liệu. do đó câu trả lời của tôi là quan trọng đối với thông báo lỗi này.
Ian Poston Framer

Tên biến sẽ không tạo ra bất kỳ sự khác biệt nào, nó có thể là success.datahoặc response.datahoặc bất kỳ thứ gì khác. Bạn thậm chí có thể sử dụng donaldTrump.datanó cũng sẽ hoạt động. Mặc dù bạn nên sử dụng các tên biến hợp lý, nhưng không chắc cái này sẽ có nhiều ý nghĩa.
Gaurav Arya

Điều này là do đối tượng thành công có một mảng có tên datachứa dữ liệu đến dưới dạng phản hồi từ máy chủ của bạn. bạn cần phải truy cập mà mảng dữ liệu, sử dụng <yourSuccessObjectName>.data
Gaurav Arya

3

Nếu bạn đang cố gắng sử dụng AngularJs 1.6.6 kể từ ngày 21/10/2017, tham số sau hoạt động dưới dạng .success và đã bị cạn. Phương thức .then () nhận hai đối số: một phản hồi và một lệnh gọi lại lỗi sẽ được gọi với một đối tượng phản hồi.

 $scope.login = function () {
        $scope.btntext = "Please wait...!";
        $http({
            method: "POST",
            url: '/Home/userlogin', // link UserLogin with HomeController 
            data: $scope.user
         }).then(function (response) {
            console.log("Result value is : " + parseInt(response));
            data = response.data;
            $scope.btntext = 'Login';
            if (data == 1) {
                window.location.href = '/Home/dashboard';
             }
            else {
            alert(data);
        }
        }, function (error) {

        alert("Failed Login");
        });

Đoạn mã trên hoạt động cho một trang đăng nhập.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.