Crea dos archivos en la misma carpeta, index.js y tasks.js

//index.js
//aqui viene la principal diferencia entre 
const { taskOne, taskTwo } = require('./tasks.js');

//creamos una funcion asincrona con gestion de errores
async function main(){
    try{
				//este es codigo sequencial 
				//porque no pasa a la siguiente linea si no termina el anterior
        console.time('Measuring time');            //medimos el tiempo 
				//ahora le damos await a toda la promesa
				//y se van a guardar en results como un array
        const results = await Promise.all([taskOne(), taskTwo()])
        console.timeEnd('Measuring time');

        console.log('Task One returned ', valueOne);
        console.log('Task Two returned ', valueTwo);
    }
    catch(e){//mostramos errores si los hay
        console.log(e)
    }
    
}
main()//llamamos a la funcion asincrona
//tasks.js
//util nos permite usar como funcion asincrona cosas que funcionan como promesas 
const util = require ('util');
//usamos util para usar setTimeout lo podamos usar como funcion asincrona
const sleep = util.promisify(setTimeout);

//module.exports envia una funcion u objeto
//vamos a simular tareas que podrĂ­an ser tareas asincronas
module.exports = {
    async taskOne() {//metodo enviado
        try{
            //throw new Error('Something wrong');// insertamos un error fictisio
            await sleep(4000) //setTimeout de 4 seg
            return 'ONE VALUE' //valor que arroja cuando se cumple
        }
        catch(e){
            console.log(e)
        }
    },
    async taskTwo() {//otro metodo enviado
        try{
            await sleep(2000)
            return 'TWO VALUE'
        }
        catch(e){
            console.log(e)
        }
        
    }

}
//Para correr esto con node escribimos en termial 
node index.js
//y acabaria en 4 seg aprox