javascript - Promise'dan hatayı throw etmeden doğru şekilde nasıl yayabilirim?
Aşağıdaki TypeScript metoduna sahibim ve bu metod bir promise döndürüyor:
public loadSavedLogin(): ng.IPromise<MyApp.Models.User> {
return this._myAppService.getUser(this.savedUserId).then((result: MyApp.Models.User) => {
if (result) {
this.userId = result.UserID;
this.userName = result.UserName;
}
return result;
}, (error) => {
this._isAuthError = true;
return error;
}
);
}
Benim sorunum, promise'in error geri çağırma fonksiyonunda. Bu metoda yapılan yukarı akış çağrıları da bir promise'e dayandığından, eğer hata doğru şekilde yukarı iletilmezse, yukarı akıştaki promise doğru çalışmaz. Ben geçici bir çözüm buldum:
(error) => {
try {
this._isAuthError = true;
return error;
} catch (e) {
//If any error occurred above make sure to still throw
throw error;
} finally {
//Allow upstream promises to continue as expected
throw error;
}
}
Bu işe yarıyor ama görünüyor, hissediliyor ve muhtemelen tamamen yanlış. Bir promiste hataları ele alma ve iletme konusunda doğru bir uygulamayı kaçırıyor gibi hissediyorum. Bu promisteki hata işlevini ele almanın daha doğru/düzgün bir yolu olmalı, tıpkı yaptığım gibi, ve yine de üst akıştaki promisin kendi hata işlevlerini işlerken doğru bir şekilde bu metoda çağrı yapmasına izin vermeli.
Hataları, bir dizi geçici throw ifadeleri kullanmadan nasıl yukarı iletebilirim?
Not: Hata mesajını dönüp aynı zamanda fırlatmak gereksiz gibi görünüyor, ancak kullandığım IPromise arayüzü bir değer döndürmezsem derlenmeyecek. Bu yüzden hatayı hem dönüyor hem de fırlatıyorum.
Not: Promiselerle hata yönetimiyle ilgili tonlarca soru okudum, ama hiçbiri benim aldığım hack vari yaklaşımı önlemeye yönelik olarak sorduğum soruya cevap vermiyor.
Cevap #1
TypeScript ile ilgili bilgim yok, ama işte bir JavaScript çözümü, burada $q.reject kullanıyorsunuz
.then(function() {},
function(error) {
this._isAuthError = true;
return $q.reject(error);
});`
Cevap #2
Hata döndürmek yerine doğrudan fırlatın:
public loadSavedLogin(): ng.IPromise<MyApp.Models.User> {
return this._myAppService.getUser(this.savedUserId).then((result: MyApp.Models.User) => {
if (result) {
this.userId = result.UserID;
this.userName = result.UserName;
}
return result;
}, (error) => {
this._isAuthError = true;
throw error;
}
);
}
Bir reddetme işleyicisinden geçerli bir dönüş (yani bir vaadi/reddedilmiş vaadi dönmemek) bir sonraki zincirdeki vaadi tamamlanmış hale getirir.
