$ http.get (…) .success no es una función

108

tengo este código:

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

En mi entorno local, funciona bien, pero en un servidor, devuelve este error:

TypeError: $ http.get (...). El éxito no es una función

¿Algunas ideas? Gracias

Alejo Ribes
fuente
1
¿Qué versión en envm local y en servidor? por cierto, $ http.get return HttpPromise, por lo que debe usar luego en su lugar
Grundy
¿Ha comprobado que todos sus javascripts se cargan en el entorno del servidor?
bansi
7
su then()nosuccess()
Patrick Evans
10
La .successsintaxis era correcta hasta Angular v1.4.3. Vea los documentos antiguos aquí: code.angularjs.org/1.4.3/docs/api/ng/service/$http
Mihai MATEI
5
y eliminado oficialmente en la
versión 1.6

Respuestas:

212

los .success sintaxis era correcta hasta Angular v1.4.3.

Para versiones hasta Angular v.1.6, debe usar el thenmétodo. El then()método toma dos argumentos: ay successuna errordevolución de llamada que se llamará con un objeto de respuesta.

Usando el then()método, adjunte una callbackfunción al archivo devuelto promise.

Algo como esto:

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

   },function (error){

   });
}

Consulte la referencia aquí.

Shortcut también hay métodos disponibles.

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

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

Se espera que los datos que obtenga de la respuesta estén en JSONformato. JSON es una excelente forma de transportar datos y es fácil de usar dentro de AngularJS

La principal diferencia entre los 2 es que la .then()llamada devuelve un promise(resuelto con un valor devuelto por a callback) mientras que .success()es una forma más tradicional de registrarse callbacksy no devuelve un promise.

Mihai Alexandru-Ionut
fuente
Probé con .then y funciona bien, gracias Alexandru-Ionut Mihai
Alejo Ribes
1
.successy .thentome un parámetro diferente, tenga en cuenta eso
Max Koretskyi
Si reescribe el código existente, puede ser fácil presentar los dos argumentos-funciones (éxito, error) mencionados anteriormente en línea, y no por separado como en el ejemplo.
Tony Sepia
"$ resource (...). get (...). then not is a function" ... ¿Por qué angularJS es tan malo cuando se trata de consistencia?
Hobbamok
8

Esto podría ser redundante, pero la respuesta más votada anterior dice .then(function (success)y eso no funcionó para mí a partir de la versión Angular 1.5.8. En su lugar, use, responseluego, dentro del bloque, response.datame dieron los datos json que estaba buscando.

$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.');
});
Ian Poston Framer
fuente
quiero decir ... lo intentaste success.data? el nombre del parámetro no es tan importante en este caso.
Kevin B
Mi código funciona. Cuando seguí la respuesta anterior, me quedé atascado. También es una respuesta con una forma de obtener los datos y registrarlos en su consola. Esto puede mostrar a los desarrolladores cómo probar sus datos en su navegador. Me llevó aquí exactamente el mismo error en el título de la pregunta.
Ian Poston Framer
código antiguo $http.get('data/data.json').success(function(data) { data = data;}con mi respuesta, un desarrollador ahora sabe data.dataque no puede obtener datos por sí mismo. por lo tanto, mi respuesta es importante para este mensaje de error.
Ian Poston Framer
El nombre de la variable no se hará ninguna diferencia, que podría ser success.datao response.datao cualquier otra cosa. Incluso podrías usar donaldTrump.dataeso también funcionará. Aunque debería usar nombres de variables razonables, no estoy seguro de que este tenga mucho sentido.
Gaurav Arya
Esto se debe a que el objeto de éxito tiene una matriz nombrada dataque contiene los datos que vienen como respuesta de su servidor. necesita acceder a esa matriz de datos, utilizando <yourSuccessObjectName>.data
Gaurav Arya
3

Si está intentando utilizar AngularJs 1.6.6 a partir del 21/10/2017, el siguiente parámetro funciona como .success y se ha agotado. El método .then () toma dos argumentos: una respuesta y una devolución de llamada de error que se llamará con un objeto de respuesta.

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

El snipit anterior funciona para una página de inicio de sesión.

Wazzie
fuente