Estoy usando una biblioteca que usa RxJS y soy nuevo en RxJS, así que, aunque busqué en Google e intenté hacer mi propia investigación, todavía estoy un poco perdido.
Esta biblioteca tiene una función que devuelve un observable. Ese observable realmente solo devuelve un solo mensaje cuando está suscrito, pero necesito esperar los datos contenidos en ese mensaje antes de que mi código pueda continuar.
He leído sobre el encadenamiento de observables y todo eso, pero lo que realmente busco es un patrón asíncrono/en espera muy simple. Noté que hay un .toPromise() en el observable que puede esperar, lo cual está bien, sin embargo, parece que la promesa se resuelve antes de la ejecución completa de mi función next(), lo que resulta en un problema de tiempo con las variables que era ajuste.
¿Eso suena correcto? ¿Cómo puedo simplemente esperar un observable Y todos sus efectos secundarios, como las llamadas a next()?
Lo que terminé haciendo, que funciona de manera confiable pero parece exagerado, es envolver una promesa como se demuestra a continuación. ¿Hay una manera más sucinta?
const result = await new Promise((resolve, reject) => { const s = jupyter.sessions.create(this._serverConfig, { kernel: {name: this._kernelName}, name: this._sessionName, path: '/path', type: 'notebook' }); s.pipe(take(1)).subscribe({ next(x) { resolve({sessionId: x.response.id, kernelId: x.response.kernel.id}); }, error(err) { reject(err); }, }); }); this._sessionId = result.sessionId; this._kernelId = result.kernelId;Para completar, este es el código anterior que NO funciona. En este código, la espera se completa en una condición de carrera con la siguiente función. Es decir, aleatoriamente, tanto sessionId como kernelId no están definidos según el mensaje de registro que sigue a la espera.
s.subscribe({ next(x) { console.log(x); sessionId = x.response.id; kernelId = x.response.kernel.id; }, error(err) { console.error('Got an error from kernel creation:') console.error(err); }, }) .add(() => { console.log('Connection subscription exiting'); }); await s.toPromise(); console.log(`Found session id ${sessionId} and kernel id ${kernelId}`);