Tengo algunos problemas para entender la diferencia entre los siguientes dos fragmentos.
const a = Observable.create( o => { setTimeout( ()=>{ console.log("now 3"); o.next(3); setTimeout(()=>{ console.log("and now 5"); o.next(5)}, 1500);} , 1500); } ); const a2 = Observable.create( o => { setTimeout( ()=>{ console.log("here is 4"); o.next(4); setTimeout(o.next(6), 1500);} , 1500); } );https://stackblitz.com/edit/rxjs-byqgnh?devtoolsheight=60
Eliminé en el segundo bloque solo el registro de la consola.
El primer bloque funciona como se esperaba: el primer número se emite después del tiempo de espera, el segundo número también.
El segundo bloque emite ambos números simultáneamente. ¿Alguien puede explicar la diferencia?
Cuando tu lo hagas
setTimeout(()=>{ console.log("and now 5"); o.next(5)}, 1500); estás pasando ()=>{ console.log("and now 5"); o.next(5)} como una función de devolución de llamada a la API setTimeout , que probablemente se activará después de 1.5sec . Y está bien ya que esto es lo que querías que sucediera.
pero cuando lo haces
setTimeout(o.next(6), 1500) Está ejecutando o.next(6) y emitiendo valor justo antes de pasarlo como una función de devolución de llamada a setTimeout , pero cuando ve que no es una firma de función, lo que o.next(6) es un valor undefined que será pase como una devolución de llamada y las posibilidades de que obtenga la Callback must be a function .
Por lo tanto, si desea que se o.next(6) como una función de devolución de llamada para establecer el tiempo de espera y emitir un valor después de 1,5 segundos, puede pasarlo como
setTimeout(() => o.next(6), 1500)o como
setTimeout(function(){ o.next(6); }, 1500)Lo siguiente genera un error de tiempo de ejecución
setTimeout(o.next(6), 1500);
TypeError [ERR_INVALID_CALLBACK]: Callback must be a function.
ya que el tipo de devolución de n.next no está definido. Sin embargo, los observables detectan errores y los emiten como eventos de error para usted. Entonces no ves eso en tu ejemplo.
Para arreglar esto, podría darle a setTimeout una función de devolución de llamada en su lugar.
setTimeout(() => o.next(6), 1500);