TypeError: Bir akış beklenirken geçersiz bir nesne sağladınız. Bir Observable, Promise, Array veya Iterable sağlayabilirsiniz
Bir hizmet çağrısından eşleme
yapmaya çalışıyorum ancak hata alıyorum.
https://stackoverflow.com/questions/41995647/subscribe-is-not-defined-in-angular-2 adresine baktım ve abone olmak için operatörlerin içinden dönmemiz gerektiğini söyledi. Benim de return ifadelerim var.
İşte kodum:
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;
});
}
Hata kaydı:
TypeError: You provided an invalid object where a stream was expected. You can provide an Observable, Promise, Array, or Iterable
49
3
Örnek kodunuzda,
map
operatörünüzün yalnızca bir çağrı alması gerekirken iki çağrı almasını sağlıyorsunuz. Hata işleme kodunuzu catch geri çağrısına taşıyabilirsiniz.Ayrıca
catch
vethrow
operatörlerini de içe aktarmanız gerekecektir.EDIT: Catch işleyicinizde
Observable.throw
döndürerek, aslında hatayı yakalamayacağınızı unutmayın - hata yine de konsolda görünecektir.Siz bir Observable döndürüyorsunuz, oysa kodunuz sadece bir boolean döndürüyor. Bu yüzden aşağıdaki gibi kullanmanız gerekir
Eğer sizin durumunuzda başka bir yaygın hizmet olan
checkservice
kullanıyorsanız, basitçeBu,
checkLogin()
işlevinizin dönüş türünü void yapacaktırve koşulunuzu kontrol etmek için
this.checkService
kullanabilirsinizBirim testimi yaparken tam olarak aynı hata mesajını aldım ve servislerimi taklit ettikten sonra gözlemlenebilir istisna attım.
Bunu
Observable.throw
içinde tam işlevi ve biçimi geçirerek çözdüm.Servisi çağıran ve veri almak için
abone
olan gerçek kod.400
hatasını işlemek içincatch
olduğuna dikkat edin.Hizmetin içindeki kod
Birim Testi
SomeService ile alay ettim ve gözlemlenebilir verileri döndürdüm ve içinde gerekli tüm yöntemler olduğu için sorun yok.
Yukarıdaki kod tamam ama catch/error koşulunu
Observable.throw({})
geçerek test etmeye çalıştığımda, servistenResponse
tipi dönüş beklediği için bana hata gösteriyordu.Bu yüzden aşağıdaki servis mocking dönüşü bana bu hatayı veriyordu.
Bu yüzden,
Response
tipi bir değer iletmek yerine geri dönüş nesnemde tam olarak beklenen işlevi çoğaltarak düzelttim.