Estou a tentar "mapear" a partir de uma chamada de serviço, mas a receber um erro. Olhei para https://stackoverflow.com/questions/41995647/subscribe-is-not-defined-in-angular-2 e disse que, para subscrever, precisamos de regressar de dentro dos operadores. Também tenho declarações de retorno.
Aqui's o meu código:
checkLogin(): Observable<boolean> {
return this.service.getData()
.map(
response => {
this.data = response;
this.checkservice = true;
return true;
},
error => {
// debugger;
this.router.navigate(['newpage']);
console.log(error);
return false;
}
)
.catch(e => {
return e;
});
}
Registo de erros:
TypeError: You provided an invalid object where a stream was expected. You can provide an Observable, Promise, Array, or Iterable
No seu código de exemplo, tem o seu operador "mapa" a receber duas chamadas de retorno, quando deveria estar a receber apenas uma. Pode mover o seu código de tratamento de erros para a sua chamada de retorno de captura.
checkLogin():Observable<boolean>{
return this.service.getData()
.map(response => {
this.data = response;
this.checkservice=true;
return true;
})
.catch(error => {
this.router.navigate(['newpage']);
console.log(error);
return Observable.throw(error);
})
}
Você'precisará também de importar os operadores de "captura" e "lançamento".
import 'rxjs/add/operator/catch';
import 'rxjs/add/observable/throw';
EDIT:
Note que ao devolver Observable.throw
no seu manipulador de capturas, ganhou't realmente capturar o erro - ele ainda virá à superfície para a consola.
Está a devolver um Observable
.map(response => <boolean>response.json())
Se estiver a utilizar outro serviço comum checkservice
no seu caso, pode simplesmente utilizar
this.service.getData().subscribe(data=>console.log(data));
Isto fará com que o seu checkLogin()
funcione com o tipo de retorno como nulo
checkLogin():void{
this.service.getData()
.map(response => {
this.data = response;
this.checkservice=true;
}).subscribe(data=>{ });
e pode utilizar o this.checkService
para verificar o seu estado
Tenho a mesma mensagem de erro exacta enquanto estava a fazer o meu teste de unidade e a lançar uma excepção observável depois de gozar com os meus serviços.
Resolvi-o passando a função exacta e o formato dentro de "Observable.throw".
Código real que chama o serviço e "subscreve" para obter dados. notar que "captura" para lidar com o erro "400".
this.search(event).catch((e: Response) => {
if (e.status === 400) {
console.log(e.json().message);
} else if (e.url) {
console.log('HTTP Error: ' + e.status + ' ' + e.statusText,
'URL: ' + e.url, 'Info: ' + e.json().message));
}
}).finally(() => {
this.loading = false;
}).subscribe((bData) => {
this.data = bData;
});
O código dentro do serviço
search() {
return this.someService.getData(request)
.do((r) => {
this.someService.defaultHeaders.delete('skipAlert');
return r;
})
.map((r) => {
return r.businessObjectDataElements.length && r.businessObjectDataElements || null;
});
}
Ridicularizei o SomeService e devolvi dados observáveis e a sua multa, uma vez que tem todos os métodos necessários dentro dele.
someServiceApi = fixture.debugElement.injector.get(SomeService);
spyOn(someServiceApi, 'getData').and.returnValue(Observable.of({}));
O código acima está correcto, mas quando eu estava a tentar testar a condição de captura/erro ao passar "Observable.throw({})estava a mostrar-me o erro, pois estava à espera de um retorno do serviço do tipo
Response'.
Por isso, abaixo do serviço, a devolução zombeteira estava a dar-me esse erro.
someServiceApi.getData
.and.returnValue(Observable.throw(new Response({status: 400, body: [], message: 'not found error'})));
Assim, corrigi-o replicando a função exacta esperada no meu objecto de retorno, em vez de passar um valor do tipo "Respostas".
someServiceApi.getData
.and.returnValue(Observable.throw({status: 400, json: () => { return {message: 'not found error'}}, body: []}));
// see `json: () => { return {message: 'not found error'}}` inside return value