$ http.get (…) .success n'est pas une fonction

109

j'ai ce code:

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

Dans mon environnement local, fonctionne bien, mais dans un serveur, renvoie cette erreur:

TypeError: $ http.get (...). Le succès n'est pas une fonction

Des idées? Merci

Alejo Ribes
la source
1
quelle version sur envm local et sur serveur? BTW, $ http.get retour HttpPromise, vous devez donc utiliser alors la place
Grundy
avez-vous vérifié que tous vos javascripts se chargent dans l'environnement serveur?
bansi
7
ce then()n'est passuccess()
Patrick Evans
10
La .successsyntaxe était correcte jusqu'à Angular v1.4.3. Voir les anciens documents ici: code.angularjs.org/1.4.3/docs/api/ng/service/$http
Mihai MATEI
5
et officiellement supprimé dans la v.1.6
adamdport

Réponses:

213

La .successsyntaxe était correcte jusqu'à Angular v1.4.3.

Pour les versions jusqu'à Angular v.1.6, vous devez utiliser thenmethod. La then()méthode prend deux arguments: a successet un errorcallback qui sera appelé avec un objet de réponse.

À l'aide de la then()méthode, attachez une callbackfonction au fichier promise.

Quelque chose comme ça:

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

   },function (error){

   });
}

Voir la référence ici.

Shortcut des méthodes sont également disponibles.

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

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

Les données que vous obtenez de la réponse doivent être au JSONformat. JSON est un excellent moyen de transporter des données , et il est facile à utiliser dans AngularJS

La principale différence entre les 2 est que l' .then()appel retourne a promise(résolu avec une valeur renvoyée par a callback) alors que .success()c'est une manière plus traditionnelle de s'enregistrer callbackset ne renvoie pas a promise.

Mihai Alexandru-Ionut
la source
J'ai essayé avec .then et ça marche bien, merci Alexandru-Ionut Mihai
Alejo Ribes
1
.successet .thenprendre des paramètres différents, en tenir compte
Max Koretskyi
Si vous réécrivez le code existant, il peut être facile de présenter les deux fonctions-arguments (succès, erreur) mentionnées ci-dessus en ligne, et non séparément comme dans l'exemple.
Tony Sepia
"$ resource (...). get (...). then is not a function" ... Pourquoi angularJS est-il si merdique en matière de cohérence?
Hobbamok
9

Cela peut être redondant, mais la réponse la plus votée ci-dessus dit .then(function (success)et cela n'a pas fonctionné pour moi à partir de la version Angular 1.5.8. Au lieu de cela, utiliser responsealors à l'intérieur du bloc response.datam'a permis d'obtenir mes données json que je recherchais.

$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.');
});
Encadreur Ian Poston
la source
je veux dire ... avez-vous essayé success.data? le nom du paramètre n'est pas si important dans ce cas.
Kevin B
Mon code fonctionne. Quand j'ai suivi la réponse ci-dessus, je suis resté coincé. C'est aussi une réponse avec un moyen d'obtenir les données et de les enregistrer sur votre console. Cela peut montrer aux développeurs comment tester leurs données dans leur navigateur. J'ai été conduit ici par la même erreur exacte dans le titre de la question.
Ian Poston Framer
ancien code $http.get('data/data.json').success(function(data) { data = data;}avec ma réponse, un développeur sait maintenant qu'il ne data.datapeut pas simplement obtenir des données par lui-même. par conséquent, ma réponse est importante pour ce message d'erreur.
Ian Poston Framer
Le nom de la variable ne fera aucune différence, cela pourrait être success.dataou response.dataou quoi que ce soit d'autre. Vous pouvez même utiliser donaldTrump.datacela fonctionnera aussi. Bien que vous deviez utiliser des noms de variables raisonnables, vous n'êtes pas sûr que celui-ci ait beaucoup de sens.
Gaurav Arya
Cela est dû au fait que l' objet de succès a un tableau nommé dataqui contient les données provenant de la réponse de votre serveur. vous devez accéder à ce tableau de données, en utilisant <yourSuccessObjectName>.data
Gaurav Arya
4

Si vous essayez d'utiliser AngularJs 1.6.6 à partir du 21/10/2017, le paramètre suivant fonctionne comme .success et a été épuisé. La méthode .then () prend deux arguments: une réponse et un rappel d'erreur qui seront appelés avec un objet de réponse.

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

Le snipit ci-dessus fonctionne pour une page de connexion.

Wazzie
la source