Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

233
Views
equivalente al operador de toque que espera a que se complete

Necesito abrir una página en una URL, obtener el valor de una variable, formatearla y devolverla.

Tengo este fragmento de código, que funciona:

 async function fetchVariable(browser, url) { const page = await browser.newPage(); await page.goto(url); const s = await page.evaluate(async () => Promise.resolve(myVariable)); return s.replace(/\n/g, ''); }

Quiero reescribirlo sin await porque... por qué no. Intenté esto:

 function fetchVariable(browser, url) { return from(browser.newPage()).pipe( tap(page => page.goto(url)), mergeMap((page) => page.evaluate(async () => Promise.resolve(myVariable))), map((s) => s.replace(/\n/g, '')) ).toPromise(); }

Estoy atascado en esta parte: tap(page => page.goto(url)), porque tap no esperará antes de pasar al siguiente operador. Y da como resultado este mensaje de error:

UnhandledPromiseRejectionWarning: Error: el contexto de ejecución se destruyó, muy probablemente debido a una navegación.

Básicamente necesito obtener la page emitida por browser.newPage() , esperar a que page.gotoUrl(url) se complete y reenviar la page al siguiente operador.

Parece que me falta un operador básico pero no puedo ver cuál.

about 4 years ago · Juan Pablo Isaza
2 answers
Answer question

0

Al ver que el goto devuelve una Promesa, le sugiero que vaya a través de RxJS y convierta todo

 function fetchVariable(browser, url) { return from(browser.newPage()).pipe( switchMap(page => // <-- use `switchMap` here from(page.goto(url)).pipe( // <-- inner pipe to allow access to `page` variable switchMap(page => from(page.evaluate)), map(() => myVariable.replace(/\n/g, '')) ) ) ); }

Acerca toPromise() : está en desuso y será eliminado por RxJS 8.

about 4 years ago · Juan Pablo Isaza Report

0

Parece que quieres hacer "switchTap". Esencialmente, realice un efecto secundario asíncrono y espere a que se complete antes de continuar.

En lugar de usar tap , podrías hacer switchMap , pero devolver un observable que devuelva la emisión original:

He aquí un ejemplo simplificado de la situación original:

 const myObservable$ = of('source #1').pipe( tap(() => myPromiseFn()), switchMap(i => of('source #2')) ); // Order: // - source #1 // - source #2 // - promise

Solución mencionada anteriormente:

 const myObservable$ = of('source #1').pipe( switchMap(input => from(myPromiseFn()).pipe( map(() => input) )), switchMap(i => of('source #2')), ); // Order: // - source #1 // - promise // - source #2

Aquí hay un pequeño StackBlitz .

about 4 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!