У меня был довольно небольшой опыт работы с обещаниями в AngularJS, и сейчас я пытаюсь разобраться с Observables в Angular.
I , как обещания для обработки одиночныхасинхронные результаты - они кажутся очень подходящими для этого варианта использования - но Angular, похоже, стремится использовать Observables для всего, поэтому я сейчас пытаюсь понять передовые методы использования этого шаблона.
Ниже приведен примеро том, как я мог бы достичь чего-то, используя цепочку обещаний.Задачи:
MyClass.value
следует всегда установить, когда doSomethingAsync()
вызывается - Вызывающий абонент - в этом случае
doSomethingElse()
должен иметь возможностьчтобы зацепить заднюю часть doSomethingAsync()
, если он хочет и , дождаться завершения , прежде чем использовать результат
export class MyClass {
private value;
public doSomethingAsync() {
return someAsyncCall()
.then(value => {
this.value = value
});
}
}
export class MyOtherClass {
public doSomethingElse() {
const myObj = new MyClass();
let myValue;
myObj
.doSomethingAsync()
.then(value => {
myValue = value
});
}
}
Я пытаюсь выяснить, как бы я это сделал, используя Observables.
Я мог бы использовать .pipe()
с tap()
в doSomethingAsync()
для захвата значения, но проблема в том, что это победилоне будет выполнено, если doSomethingElse()
не вызовет subscribe()
в возвращаемом Наблюдаемом.Я не хочу, чтобы doSomethingAsync()
зависело от того, что будет делать вызывающий абонент.
Я мог бы вызвать subscribe()
в doSomethingAsync()
, чтобы получить значение, но тогда я больше не будуиметь наблюдаемый, чтобы вернуться.Поэтому я думаю, что мне, возможно, придется сделать что-то вроде этого:
export class MyClass {
private value;
private valueSubject: Subject<any> = new Subject<any>();
public doSomethingAsync() {
someAsyncCall()
.subscribe(value => {
this.value = value;
this.valueSubject.next(value);
});
return valueSubject.asObservable();
}
}
export class MyOtherClass {
public doSomethingElse() {
const myObj = new MyClass();
let myValue;
myObj
.doSomethingAsync()
.subscribe(value => {
myValue = value
});
}
}
Но это кажется слишком сложным, так как мне теперь также приходится возиться с Субъектами и эффективно иметь 2 различных потока, которые нужно отслеживать.
Кто-нибудь может предложить лучший способ сделать это?Мне кажется, что с обещаниями гораздо легче справиться ...?