Estoy tratando de simplemente encadenar algunas funciones asíncronas para que funcionen en orden. Probablemente estoy cometiendo un error básico.
Solo quiero que se ejecute printFirst y luego una vez que se complete para que se ejecute printSecond.
a continuación está mi código que no funciona
const printFirst = ()=>{ console.log('First') } const printSecond = ()=>{ console.log('Second') } // Print this first (after 2 sec) const first = () =>{ setTimeout(printFirst,2000) } // Once the above function is run then run this const second = () =>{ setTimeout(printSecond,2000) } first() .then(second())me sale el error
node timeout.js file:///Users/bob/Documents/dev/javascript/node/nodeScratch/timeout.js:20 .then(second()) ^ TypeError: Cannot read properties of undefined (reading 'then') at file:///Users/bob/Documents/dev/javascript/node/nodeScratch/timeout.js:20:1 at ModuleJob.run (node:internal/modules/esm/module_job:195:25) at async Promise.all (index 0) at async ESMLoader.import (node:internal/modules/esm/loader:337:24) at async loadESM (node:internal/process/esm_loader:88:5) at async handleMainPromise (node:internal/modules/run_main:61:12)Vi una publicación aquí ¿Cómo accedo a los resultados de promesas anteriores en una cadena .then()? lo que sugiere que es posible que no tenga que usar "entonces". Sin embargo, no estoy seguro de si eso es realmente relevante para mi caso de uso.
Las funciones asíncronas básicas en JS se basan en Promises. Puede escribir una Promesa que espera una respuesta de la red u otro IO. Puede escribir uno que espere la interacción del usuario. También puede escribir uno que espere el final de un setTimeout . Este es un ejemplo de eso:
const printFirst = ()=>{ console.log('First') } const printSecond = ()=>{ console.log('Second') } // Print this first (after 2 sec) const first = () => new Promise ((resolve, reject) => { setTimeout(() => resolve(printFirst()), 2000) }) // Once the above function is run then run this const second = () =>{ setTimeout(printSecond,2000) } first() .then (second) Además de envolver su primera función en una new Promise , también debemos cambiar
first () .then (second ())a
first () .then (second) La inicial dispara la second función inmediatamente y pasa el resultado a .then . En su lugar, queremos pasar la función en sí. Para necesidades más complejas, podría hacer esto en su lugar:
first () .then (result => second (result, someOtherArgument)) Si desea que algo más se ejecute después de second , entonces también debe incluirse en una Promise .