Supongamos que tengo un código como este:
let result = { name: downloadNameFromInternetVerySlow(), isFamous: determineIfNameIsFamous(this.name); } const downloadNameFromInternetVerySlow = () => { path = "/home"; const folders = fs.readdirSync(path).filter(file => fs.lstatSync(path).isDirectory()); console.log(folders); return folders[0]; } downloadNameFromInternetVerySlow puede llevar mucho tiempo, mientras tanto, determineIfNameIsFamous depende del resultado de downloadNameFromInternetVerySlow para devolver el valor correcto.
¿Cómo me aseguro de que determineIfNameIsFamous solo se ejecute después de que finalice downloadNameFromInternetVerySlow ?
Puede convertir downloadNameFromInternetVerySlow en Promise (si aún no lo ha hecho). y luego el usuario await para esperar hasta que termine. De lo contrario, puede usar Promise.then()
(Esto debería estar dentro de una función async )
let name = await downloadNameFromInternetVerySlow(), let isFamous = determineIfNameIsFamous(this.name); let result = { name, isFamous } Otro método usando Promise.then
let name, isFamous; downloadNameFromInternetVerySlow().then(result => { name = result; isFamous = determineIfNameIsFamous(this.name); });Suponiendo que downloadNameFromInternetVerySlow sea asíncrono (de lo contrario, ya funcionaría como usted desea), la solución es usar await .
Tenga en cuenta que, para poder hacer eso, este código debe incluirse en una función async (o en un nivel superior con espera de nivel superior disponible).
async function getAndUseResult(){ let result = { name: await downloadNameFromInternetVerySlow(), isFamous: determineIfNameIsFamous(this.name) } console.log(JSON.stringify(result)) } getAndUseResult();asíncrono/espera
Hay una sintaxis especial para trabajar con promesas de una manera más cómoda, llamada " async/await ".
Una función asíncrona devuelve una promesa, como en este ejemplo:
const doSomethingAsync = () => { return new Promise(resolve => { setTimeout(() => resolve('I did something'), 3000) }) }Cuando desee llamar a esta función, anteponga esperar y el código de llamada se detendrá hasta que la promesa se resuelva o rechace. Una advertencia: la función del cliente debe definirse como asíncrona. Aquí hay un ejemplo:
const doSomething = async () => { console.log(await doSomethingAsync()) }