выполнить одну функцию после завершения другой

Рейтинг: 2Ответов: 2Опубликовано: 24.06.2023

Как добиться выполнения данного кода последовательно? Я попробовала несколько вариантов, ничего не работает, неизменно в консоль сначала выводится 'second', потом 'first'

const command = async () => {
 setTimeout(() => console.log('first'), 800)
} 
const start = async () => {
 await command();
 console.log('second');
}
start()
const command = async () => {
  setTimeout(() => console.log('first'), 800)
 } 
 const start = async () => {
  command().then(() => {
    console.log('second');
  })
 }
 start()
const command = async () => {
  setTimeout(() => console.log('first'), 800)
 } 
 const start = async () => {
  new Promise((res, rej) => {
    command()
    res()
  }).then(() => console.log('second'))
 }
 start()

Ответы

▲ 3Принят

В Вашем случае SetTimeout никак не связан с завершением асинхронной функции command, для того чтобы сделать эту связь нужно в return вернуть Promise, который будет резолвится(resolve()) сразу после того как отработает console.log.

Сейчас вызов command запускает SetTimeout, функция таймаута () => console.log('first') попадает в event loop и происходит мгновенный выход из функции command (c возвратом undefined).

Решение:

Так как в 3-х случаях функция сommand та же, я сократил немного код и сделал ее общей для всех трех случаев, добавил индексы для того чтобы не было конфликта имен, и поправил третий случай start:

const command = async(n) => new Promise(resolve => {
  setTimeout(() => {
    console.log('first' + n)
    resolve()
  }, 800)
})

const start1 = async() => {
 await command(1);
 console.log('second1');
}

const start2 = async() => {
  command(2).then(() => {
    console.log('second2');
  })
}

const start3 = async() => {
  new Promise(async(res, rej) => {
    await command(3) // добавлен await
    res()
  }).then(() => console.log('second3'))
}

start1()
start2()
start3()

▲ 3

Попробуйте следующий код:

const command = new Promise(resolve => {
    setTimeout(() => {
        resolve(console.log("first"))
    }, 800);
});

command.then(()=>{
    console.log("second")
})

Или же:

const command = async () => {
    return new Promise(resolve => {
        setTimeout(() => {
            console.log('first');
            resolve();
        }, 800);
    });
};

const start = async () => {
    await command();
    console.log('second');
};

start();

command() возвращает новый промис, который выполняется с помощью setTimeout(). Когда он заканчивается, промис разрешается с помощью resolve(). Затем в start(), await command() ждет, пока промис не разрешится, и только тогда вызывается console.log("second").