typescript - Är det säkert att prenumerera på en observable med en asynkron funktion
Jag har en händelseutlösare som skickar händelser med 50 Hz. Jag skulle vilja prenumerera på denna utlösare med en asynkron metod. Koden ser ut som följande:
this.emitter = fromEventPattern(this.addHandler, this.removeHandler, (err, char) => [err, char]);
this.rxSubscription = this.emitter.subscribe(this.handleUpdatedValuesComingFromSensor);
och
handleUpdatedValuesComingFromSensor = async (arr: any[]): Promise<void> => {
...
await someMethodAsync();
...
}
Jag kan ha fel men jag har intrycket att await där gör att emitter direkt anropar onNext() eftersom jag har lämnat metoden.
Detta är mycket svårt att felsöka med konsolanrop på grund av evenemangshastigheten.
Har jag rätt eller fel?
Tack för din hjälp.
REDIGERA 1:
Jag använder TypeScript som riktar sig mot ES2015, så en tillståndsmaskin genereras för async/await.
Om jag har rätt, hur kan jag säkerställa att samtal inte överlappar? Jag behöver beräkna medelvärden på värden jag tar emot.
Svar #1
att vänta där gör att emitter anropar onNext() omedelbart eftersom jag har lämnat metoden
Du har rätt. Rx ignorerar returtyperna för sina prenumerationsfunktioner, så det ignorerar det löfte som returneras från din async-funktion när den når sitt första await. Detta betyder:
- Så snart ett annat objekt anländer på observable, kommer Rx att anropa din prenumerationsfunktion igen. Den ignorerade löftet som returnerades, så den vet inte att det gamla anropet fortfarande pågår.
- Undantag från din
async-funktion kommer att ignoreras, eftersom löftet ignorerades. Vissa löftebibliotek har en global "oobserverad löftefel"-händelse som kan hantera detta.
Svar #2
Jag är inte helt säker på vad dina farhågor är. Det är giltigt, din metod kommer att anropas en gång för varje enskilt element. Den kommer inte att hoppa över något eller avbryta din metod halvvägs, men:
- Det kommer inte att vänta på att en iteration av
handleUpdatedValuesComingFromSensorska avslutas innan en annan påbörjas (förutsatt atthandleUpdatedValuesComingFromSensorverkligen gör något asynkront) så du kan ha flera instanser avhandleUpdatedValuesComingFromSensorpå gång samtidigt. - På samma sätt, om du har flera prenumeranter, kommer det inte att vänta på att
handleUpdatedValuesComingFromSensorska bli klar innan händelsen skickas till nästa prenumerant.