2012-10-26 5 views
9

Quindi sto utilizzando il servizio restful angularjs $ resource e sto chiamando la funzione $ save. Tuttavia, il callback di errore che ho passato non viene chiamato. Il server sta inviando un errore 418 che ho pensato dal momento che NON è 200 risulterebbe nella chiamata di errore richiamata. Ma non lo fa mai. Non riesco a trovare alcuna documentazione che indichi quali codici di errore http determineranno il richiamo della chiamata di errore.Il servizio AngularJS non sta richiamando la richiamata di errore sul metodo save()

Ecco il mio codice:

var modalScope = $scope.$new(); 
modalScope.showPassword = false; 
modalScope.message = null; 
modalScope.user = new User(); 

modalScope.submit = function(user) { 
    user.$save({}, function(data,headers) { 
     // do the success case 
    }, function(data,headers) { 
     // do the error case     
    }); 
}; 

Il modalScope.user viene passato alla funzione di inviare definita. Quindi qual è il problema per cui non viene chiamata questa richiamata di errore?

+0

Quindi, viene sempre chiamato il callback 'successo'? – Tosh

+0

Sì, viene sempre chiamato il callback di successo. – chubbsondubs

+4

Penso di aver trovato il problema, il tuo server web è una teiera. –

risposta

8

ho trovato il seguente nel codice sorgente ngResource

$http({method: 'GET', url: '/someUrl'}). 
    success(function(data, status, headers, config) { 
     // this callback will be called asynchronously 
     // when the response is available 
    }). 
    error(function(data, status, headers, config) { 
     // called asynchronously if an error occurs 
     // or server returns response with status 
     // code outside of the <200, 400) range 
    }); 

Io sono un po 'confuso circa la notazione di gamma, ma sembra che in realtà dovrebbe chiamare il metodo di errore. Forse hai trovato un bug.

+2

La documentazione di Angularjs è assolutamente abissale. Sono veramente terribili. Non posso dire abbastanza terribilmente terribile sono a spiegare se stessi. Detto questo penso che nulla tra 100-200, 400-499 NON sono considerati errori. WTF ?! Destra?! Come diavolo ha senso. Un 404 sarebbe un errore! Quale pagina dei documenti hai trovato? Pubblicherò un commento chiedendo loro di chiarire e potenzialmente cambiare la loro politica insipida. – chubbsondubs

+0

Merda Ho riletto il tuo commento. Era nel codice sorgente. Yay per la documentazione. Comunque grazie per averlo trovato! – chubbsondubs

+0

@chubbsondubs Non l'ho trovato nei documenti ma nel codice sorgente angolare. Cerca "400)" qui per trovare il passaggio: https://ajax.googleapis.com/ajax/libs/angularjs/1.0.2/angular.js –

4

ho avuto problemi con la richiamata errore pure, ma sembra che nelle versioni più recenti di AngularJS, il metodo di errore di callback deve ora essere implementato qualcosa di simile:

SomeResource.query({}, angular.noop, function(response){ 
    $scope.status = response.status; 
}); 

Fonte + descrizione più dettagliata: https://groups.google.com/d/msg/angular/3Q-Ip95GViI/at8cF5LsMHwJ

Inoltre, in risposta ai commenti sul post di Flek, sembra che ora solo le risposte tra 200 e 300 non siano considerate un errore.

0

sto copiando dalla ngResource documentation:

I metodi di azione sull'oggetto classe o oggetto istanza può essere richiamato con i seguenti parametri:

  • HTTP GET azioni "classe": Risorsa.action ([parametri], [successo], [errore])
  • azioni "di classe" non GET: Resource.action ([parametri], postData, [successo], [errore])
  • no n-GET azioni istanza:. esempio $ azione ([parametri], [successo], [errore])

Successo callback è chiamato con (valore, responseHeaders) argomenti. La callback degli errori viene chiamata con l'argomento (httpResponse).

$save è considerato come un'azione non-GET "classe", quindi è necessario utilizzare un parametro aggiuntivo postData. Utilizzando lo stesso esempio domanda, questo dovrebbe funzionare:

modalScope.submit = function(user) { 
    user.$save({}, {}, function(data,headers) { 
     // do the success case 
    }, function(response) { 
     // do the error case     
    }); 
}; 

tenere d'occhio il callback errore, rispetto alla esempio, sta chiamando con un solo argomento, che porta tutta la risposta HTTP.

+2

Non è $ save() un'azione di istanza che rende il callback di errore il terzo parametro? – PilotBob

2

non ho potuto ottenere la risposta di Alter al lavoro, ma questo ha funzionato per me:

user.$save(function (user, headers) { 
        // Success 
        console.log("$save success " + JSON.stringify(user)); 
       }, function (error) { 
        // failure 
        console.log("$save failed " + JSON.stringify(error)) 
       }); 
5

avuto lo stesso problema e nulla qui ha funzionato. Ho scoperto che disponevo di un debug-intercettore personalizzato che non restituiva esplicitamente un $ q.reject (risposta).

Apparentemente ogni debug-intercettore personalizzato sovrascrive completamente il comportamento predefinito.

Vedere https://github.com/angular/angular.js/issues/2609#issuecomment-44452795 per dove ho trovato la risposta.

+0

Mi hai salvato la giornata! –

+0

Ranera nello stesso problema. Grazie per questo! – weltschmerz

+0

Questo mi ha fatto risparmiare un sacco di tempo. Il problema era in uno dei nostri intercettori. Grazie – dimiguel

-1

In realtà se seguiamo la documentazione. funziona

User.save(vm.user, function (response) { 
       FlashService.Success('Registration successful', true); 
       $location.path('/login'); 
     }, 
     function (response) { 

      FlashService.Error(response.data); 
      vm.dataLoading = false; 

     }); 

sopra è snip dal mio codice funziona.

Problemi correlati