$ 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.