Estoy haciendo algunos ejercicios en async/await y estoy completamente en blanco en este:
La función
opA debe llamarse antes deopB, yopBllamarse antesopC. Llame a las funciones de tal manera que se imprimaC luegoB luegoA.
const print = (err, contents) => { if (err) console.error(err) else console.log(contents ) } const opA = (cb) => { setTimeout(() => { cb(null, 'A') }, 500) } const opB = (cb) => { setTimeout(() => { cb(null, 'B') }, 250) } const opC = (cb) => { setTimeout(() => { cb(null, 'C') }, 125) } Supongo que hay un error tipográfico en la pregunta, por lo que debería hacer que las funciones impriman ABC y no CBA .
Mi intento es este:
(async function () { await print(opA()); await print(opB()); await print(opC()); }());pero lo consigo
cb(null, 'C') ^ TypeError: cb is not a functionPregunta
Literalmente no tengo idea de cómo resolver este problema y no entiendo el uso de la función de print .
Cualquier ayuda sobre cómo ponerme en marcha será muy apreciada =)
Dijiste que este es un ejercicio async/await, pero el código que muestras es la antítesis completa de async/await: utiliza el paradigma de devolución de llamada.
Para hacer que su código imprima CBA , necesitaría pasar devoluciones de llamada a las funciones opX en tal orden para que impriman sus resultados:
const print = (err, contents) => { if (err) console.error(err) else console.log(contents ) } const opA = (cb) => { setTimeout(() => { cb(null, 'A') }, 500) } const opB = (cb) => { setTimeout(() => { cb(null, 'B') }, 250) } const opC = (cb) => { setTimeout(() => { cb(null, 'C') }, 125) } opA(print); opB(print); opC(print);La función almacenada en optA , opB , opC acepta una función de devolución de llamada cb que se llama en el tiempo de espera, con el primer argumento establecido en null y el segundo en A , B , C .
print contiene una función que acepta un error ( err ) como primer argumento y lo que se va a imprimir como segundo argumento ( contents ).
Entonces combinaría la función opt con print de esa manera: optA(print) .
En la forma actual de la pregunta, sería simplemente:
opA(print) opB(print) opC(print) const print = (err, contents) => { if (err) console.error(err) else console.log(contents ) } const opA = (cb) => { setTimeout(() => { cb(null, 'A') }, 500) } const opB = (cb) => { setTimeout(() => { cb(null, 'B') }, 250) } const opC = (cb) => { setTimeout(() => { cb(null, 'C') }, 125) } opA(print) opB(print) opC(print) Para obtener el resultado: C , B , A (debido a los retrasos utilizados para setTimeouts ).
Pero puede que falte algo en la pregunta.
El orden en que llame a estas funciones es casi irrelevante para el resultado deseado. Los temporizadores están configurados para ejecutarse en ese orden específico, primero C , luego B y luego A
Así que puedes llamarlos:
opA(print); opB(print); opC(print);O incluso:
opB(print); opA(print); opC(print);O incluso:
opC(print); opB(print); opA(print);Sin embargo, hay formas en las que puede cambiar el orden en el que obtendría un resultado incorrecto. Por ejemplo:
opA((err, a) => ( print(err, a), opB((err,b) => ( print(err, b), opC(print) )) )) Que llamará a opB después de que se ejecute el temporizador establecido por opA y opC se llamará opB después de que se ejecute el temporizador opB.
Creo que el propósito del ejercicio podría ser que puedas observar que el orden en el que llamas a tus funciones no siempre refleja el orden que podrías esperar intuitivamente.