TypeError: Du har oppgitt et ugyldig objekt der det var forventet en strøm. Du kan oppgi en Observable, Promise, Array eller Iterable.

Jeg prøver å mappe fra et tjenesteanrop, men får en feil. Så på https://stackoverflow.com/questions/41995647/subscribe-is-not-defined-in-angular-2 og det sto at for å abonnere må vi returnere fra innsiden av operatørene. Jeg har også retursetninger.

Her' s koden min:

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;
        });
}

Feillogg:

TypeError: You provided an invalid object where a stream was expected. You can provide an Observable, Promise, Array, or Iterable

I eksempelkoden din mottar map-operatoren to tilbakekallinger, mens den bare skal motta én. Du kan flytte feilhåndteringskoden til catch-tilbakekallet.

checkLogin():Observable{
    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);
                       })
   }

Du må også importere operatorene catch og throw.

import 'rxjs/add/operator/catch';
import 'rxjs/add/observable/throw';

EDIT: Vær oppmerksom på at ved å returnere Observable.throw i catch-håndteringen, vil du ikke fange opp feilen - den vil fortsatt vises i konsollen.

Kommentarer (3)

Du returnerer en Observable mens koden din bare returnerer en boolean. Så du må bruke som nedenfor

.map(response => response.json())

Hvis du bruker en annen vanlig tjeneste checkservice i ditt tilfelle, kan du ganske enkelt bruke

this.service.getData().subscribe(data=>console.log(data));

Dette vil gjøre checkLogin()-funksjonen din med returtype void.

 checkLogin():void{
      this.service.getData()
            .map(response => {  
                           this.data = response;                            
                           this.checkservice=true;
             }).subscribe(data=>{ });

og du kan bruke this.checkService til å sjekke betingelsen.

Kommentarer (6)

Jeg har nøyaktig samme feilmelding mens jeg gjorde enhetstesten min og kastet observerbare unntak etter å ha mocket tjenestene mine.

Jeg løste det ved å sende nøyaktig funksjon og format inne i Observable.throw.

Faktisk kode som kaller tjenesten og subscribe for å få data. legg merke til at catch for å håndtere 400-feilen.

     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;
      });

Koden inne i tjenesten

  search() {
    return this.someService.getData(request)
       .do((r) => {
          this.someService.defaultHeaders.delete('skipAlert');
          return r;
        })
      .map((r) => {
          return r.businessObjectDataElements.length && r.businessObjectDataElements || null;
        });
  }

Unit Testing

Jeg har hånet SomeService og returnert observerbare data, og det går bra, siden den har alle de nødvendige metodene i seg.

 someServiceApi = fixture.debugElement.injector.get(SomeService);
 spyOn(someServiceApi, 'getData').and.returnValue(Observable.of({}));

Koden ovenfor er okey, men da jeg prøvde å teste catch/error-tilstanden ved å sende Observable.throw({}), viste den meg feilen da den forventet Response type retur fra tjenesten.

Så under tjenesten mocking retur ga meg den feilen.

someServiceApi.getData
  .and.returnValue(Observable.throw(new Response({status: 400, body: [], message: 'not found error'})));

Så jeg korrigerte det ved å replikere den eksakte forventede funksjonen i returobjektet mitt i stedet for å sende en verdi av typen Response.

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
Kommentarer (0)