$ 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

Alejo Ribes
fonte
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.

Mihai Alexandru-Ionut
fonte
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.');
});
Ian Poston Framer
fonte
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.

Wazzie
fonte