Как упорядочить рандомные setTimeout

Как сделать так, чтобы гарантировано вывело в консоль A, B, C. Править функции нельзя.

function A() {
    setTimeout(() => {
    console.log('A')
  }, Math.random()*100)
}

function B() {
    setTimeout(() => {
    console.log('B')
  }, Math.random()*100)
}

function C() {
    setTimeout(() => {
    console.log('C')
  }, Math.random()*100)
}

Ответы (2 шт):

Автор решения: HTO HOT

Вот решение через Promise

function A() {
    return new Promise((resolve)=>{
        setTimeout(() => {
            console.log('A')
            resolve();
          }, Math.random()*100)
    });
    
}

function B() {
    return new Promise((resolve)=>{
        setTimeout(() => {
            console.log('B')
            resolve();
          }, Math.random()*100)
    });
    
}

function C() {
    return new Promise((resolve)=>{
        setTimeout(() => {
            console.log('C')
            resolve();
          }, Math.random()*100)
    });
    
}
async function start(){
    await A();
    await B();
    C();

}
start();

Если есть какие-то вопросы спрашивайте.

→ Ссылка
Автор решения: Leonid

Для того, что бы гарантированно получить A,B,C можно по очереди вызвать каждую функцию в разное время, учитывая предельно возможную девиацию выполнения каждой из них.

[A,B,C].forEach((f,i) => {setTimeout(() => {f()}, i*100)});

function A() {
    setTimeout(() => {
    console.log('A')
}, Math.random()*100)
}

function B() {
    setTimeout(() => {
    console.log('B')
}, Math.random()*100)
}

function C() {
    setTimeout(() => {
    console.log('C')
}, Math.random()*100)
}
  

→ Ссылка