Tengo un pequeño problema con mi código (Node.js). Quiero tener 2 archivos app.js y state.js, básicamente creé los dos para tratar de resolver el problema que tengo.
en el segundo archivo "State.js" tengo una función que devuelve un objeto y retrasé el retorno por 10 segundos (con la impresión de un Internet lento, etc.). y estoy tratando de recuperar el objeto en el archivo app.js. pero de momento no funciona. Intenté usar la promesa (async & await) pero eso devuelve un error en la terminal, también intenté ejecutar un setInterval para monitorear la variable i que usar para recuperar el objeto para ejecutar solo cuando tiene datos pero eso no funciona también. Por favor necesito ayuda lo antes posible.
A continuación se muestran los ejemplos de código para el escenario 2.
========================== archivo state.js =================== ====
function test(val){ setTimeout(() => { return { code: 0, value: val } }, 10000); } module.exports = test;========================== archivo app.js (usando el enfoque de promesa)============== ==============
async function runNow(){ let v = await t('some string'); console.log(v.value) } runNow();================================= app.js (usando el enfoque de intervalo) ======= ===
function runNow(){ let engine = setInterval(() => { let v = t('some string'); if(v === null || v === undefined){ console.log(v); }else{ clearInterval(engine); console.log(v.value); } }, 5000); // console.log(v.value); } runNow();Debe usar la promesa o la devolución de llamada para lograr lo que desea hacer aquí.
Si devuelvo algo de la función de callback de llamada de setTimeout(callback, time) , en realidad no lo devuelve la función setTimeout .
La implementación de setTimeout es probablemente similar a algo como esto.
function setTimeout(callback, time, ...args) { // After the given time it executes the callback callback(...args); }La implementación deseada de su archivo state.js sería como la siguiente:
function testWithPromise(val) { return new Promise((resolve) => { setTimeout(() => { resolve({ code: 0, value: val, }); }, 5000); }); } function testWithCallback(val, callback) { setTimeout(() => { callback({ code: 0, value: val, }); }, 3000); } // export the function // use it in other modules as testWithCallback("callback_approach", console.log); testWithPromise("promise_approach").then(console.log); // or with an async function async function getValue() { const value = await testWithPromise("async_promise"); console.log(value); } //getValue();Necesitas crear una promesa para que await la espere
Probar:
function test(val) { return new Promise((resolve, reject) => { setTimeout(() => { resolve({code: 0, value: val}); }, 10000); }); } async function runNow() { let v = await test('someString'); console.log(v.value); }