Чтобы сохранить мой код в чистоте, я хочу создать универсальный метод для возврата данных из наблюдаемых, которые также отписываются после возвращения данных.Он возвращает данные, но часто возвращает данные слишком поздно, в то время как код переместился, что не очень хорошо работает на странице входа в систему ...
import { Observable, throwError } from "rxjs";
import { Type } from "@angular/compiler";
export async function resolveObseravableData<T>
(obs: Observable<any>, classReference: { new (): T}) : T {
let instance = new classReference();
let obsRes = await obs.subscribe((data: T) => { instance = data; },
(err: Error) => {
throwError(`Error in utility.functions.resolveObseravableData: ${err.message}`); })
obsRes.unsubscribe();
return instance;
}
Когда я добавляю асинхронный вызов в заголовок функции, я получаю "Тип T не является допустимым типом возврата асинхронной функции в ES5 / ES3 ", поскольку он не ссылается на значение конструктора, совместимого с Promise."отписался от, чтобы предотвратить утечку памяти, однако большая часть кода выглядит так, как показано ниже, и, если не считать превращения его в переменную, я не знаю ни одного способа отписаться.
this.authService.login(this.f.email.value, this.f.password.value).subscribe(
data => {
if (data) {
console.log('logged in ' + this.authService.currentUser.email);
this.router.navigate([this.returnUrl]);
} else {
console.log('currrent user is null');
}
},
err => {
console.log('error on login' + err.message);
});
Использование решателя для замены выше:
if (resolveObseravableData(
this.authService.login(this.f.email.value, this.f.password.value), Boolean)) {
this.router.navigate([this.returnUrl]);
} else {
console.log('currrent user is null');
};
Является ли эта идея наблюдаемого резольвера просто плохой идеей или есть более чистый способ сделать это?