Tengo un problema con el orden de mis funciones y no sé por qué.
Al pasar el cursor sobre la llamada para function_2 dentro de la primera función, VSCode me da el resultado de Promise<void> , y la consola muestra undefined cuando se ejecuta (antes de function_2() incluso finalice).
Dado que estoy editando en VSCode, me dice en la parte superior cuando paso el mouse sobre una return que es para la request de devolución de llamada, por lo que tengo una idea general de cuál es el problema. Más allá de eso, no tengo idea, y lo más probable es que se deba a mi falta de comprensión sobre los rendimientos de las promesas y/o la verdadera secuencia de cuándo suceden las cosas en un guión.
Todo lo demás en mi código funciona sin problemas.
He investigado esto bastante extensamente sin suerte (tanto en este sitio como en alguna documentación general del código), pero avíseme si hay algo que me perdí.
He incluido el orden general de mis funciones a continuación y dónde están las llamadas de return .
async function_1() { const check = await function_2(); return console.log(check); } async function_2() { ... if(...){ ... request(... => { ... while(...) { if(...) { ... return 'result'; //<<<RETURN } await msg.channel.awaitMessages({ ... }).then((c) => { if() { ... if() { ... return 'result'; //<<<RETURN }; } else if { ... return 'result'; //<<<RETURN } else { }; }).catch((c) => { ... return 'result'; //<<<RETURN }); }; //<<<end 'while' }); //<<<end 'request' }; //<<<end 'if' };Si mi explicación no fue clara o se necesita más código, hágamelo saber.
VSCode puede analizar su código y concluir que siempre devuelve Promise<void> un retorno nulo es lo mismo que indefinido en este contexto.
En primer lugar, Promise<T> siempre se devuelve desde una función async .
En segundo lugar, en la llamada a request(... => { está proporcionando una devolución de llamada, el valor de retorno de esta devolución de llamada es utilizado por solicitud y no por función_2 .
Esto significa que sus devoluciones dentro de sus devoluciones de llamada nunca devuelven ningún valor para function_2 .
Si desea devolver un valor de la function_2 principal_2, puede resolver una Promise personalizada como esta:
function function_2() { // note: not async because we already return a Promise return new Promise((resolve, reject) => { request(() => { /* ... */ resolve("some value"); // effectively returns a value to the Promise if (error) { reject(error); // throw an error } /* ... */ }); }); } try { const value = await function_2(); console.log(value); // "some value" } catch(e) { console.error(e); }