$ http.get (…) .success não é uma função


108

eu tenho este código:

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

No meu ambiente local, funciona bem, mas em um servidor, retorna este erro:

TypeError: $ http.get (...). Sucesso não é uma função

Alguma ideia? obrigado


1
qual versão no envm local e no servidor? btw, $ http.get retornar HttpPromise, então você precisa usar , em seguida, em vez
Grundy

você verificou se todos os seus javascripts carregam no ambiente do servidor?
bansi

7
a sua then()nãosuccess()
Patrick Evans

10
A .successsintaxe estava correta até o Angular v1.4.3. Veja os documentos antigos aqui: code.angularjs.org/1.4.3/docs/api/ng/service/$http
Mihai MATEI

5
e removido oficialmente na v.1.6
adamdport

Respostas:


212

A .successsintaxe estava correta até o Angular v1.4.3.

Para versões até o Angular v.1.6, você deve usar o thenmétodo. O then()método leva dois argumentos: ae successum errorretorno de chamada que será chamado com um objeto de resposta.

Usando o then()método, anexe uma callbackfunção ao retornado promise.

Algo assim:

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

   },function (error){

   });
}

Veja a referência aqui.

Shortcut métodos também estão disponíveis.

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

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

Os dados que você recebe da resposta devem estar em JSONformato. JSON é uma ótima maneira de transportar dados e é fácil de usar no AngularJS

A principal diferença entre os 2 é que a .then()chamada retorna a promise(resolvido com um valor retornado de a callback), enquanto .success()é a forma mais tradicional de registro callbackse não retorna a promise.


Tentei com .então e funciona bem, obrigado Alexandru-Ionut Mihai
Alejo Ribes

1
.successe .thentomar parâmetros diferentes, leve em consideração isso
Max Koretskyi

Se reescrever o código existente, pode ser fácil apresentar os dois argumentos-funções (sucesso, erro) mencionados acima in-line, e não separadamente como no exemplo.
Tony Sepia

"$ resource (...). get (...). then not a function" ... Por que o angularJS é tão ruim quando se trata de consistência?
Hobbamok

8

Isso pode ser redundante, mas a resposta mais votada acima diz .then(function (success)e isso não funcionou para mim na versão Angular 1.5.8. Em vez disso, use o responsedentro do bloco para response.dataobter os dados json que estava procurando.

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

quero dizer ... você tentou success.data? o nome do parâmetro não é tão importante neste caso.
Kevin B

Meu código funciona. Quando segui a resposta acima, fiquei paralisado. É também uma resposta com uma maneira de realmente obter os dados e registrá-los em seu console. Isso pode mostrar aos desenvolvedores como testar seus dados em seus navegadores. Fui levado até aqui pelo mesmo erro exato no título da pergunta.
Ian Poston Framer

código antigo $http.get('data/data.json').success(function(data) { data = data;}com minha resposta, um desenvolvedor agora sabe data.dataque não pode simplesmente obter dados sozinho. portanto, minha resposta é importante para esta mensagem de erro.
Ian Poston Framer

O nome da variável não fará nenhuma diferença, pode ser success.dataou response.dataou qualquer outra coisa. Você pode até usar donaldTrump.dataisso também funcionará. Embora você deva usar nomes de variáveis ​​razoáveis, não tenho certeza se este fará muito sentido.
Gaurav Arya

Isso ocorre porque o objeto de sucesso tem uma matriz chamada dataque contém os dados que chegam como resposta de seu servidor. você precisa acessar essa matriz de dados, usando <yourSuccessObjectName>.data
Gaurav Arya

3

Se você está tentando usar AngularJs 1.6.6 em 21/10/2017, o seguinte parâmetro funciona como .success e foi esgotado. O método .then () leva dois argumentos: uma resposta e um retorno de chamada de erro que será chamado com um objeto de resposta.

 $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 snipit acima funciona para uma página de login.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.