Ответ 1
setTimeout
добавляет задержку перед вызовом функции, тогда как async
/await
является синтаксическим сахаром ontop promises, способ связать код для запуска после вызов завершается, поэтому они разные.
setTimeout имеет ужасные характеристики обработки ошибок, поэтому я рекомендую следующее во всем коде:
let wait = ms => new Promise(resolve => setTimeout(resolve, ms));
а затем никогда больше не вызывайте setTimeout
.
Теперь ваш код будет выглядеть следующим образом:
let foo = async () => {
await wait(2000);
await this._doSomething();
}
кроме foo
ждет завершения doSomething
. Обычно это желательно, но без контекста трудно понять, чего вы хотите. Если вы хотите запустить doSomething
параллельно с другим кодом, я рекомендую:
async () => { await Promise.all([foo(), this._otherCode()]); };
для объединения и захвата ошибок в одном и том же месте.
Если вы действительно хотели стрелять и забыть _doSomething
, а не ждать его, вы можете потерять await
, но вы должны попробовать/уловить ошибки:
async () => {
let spinoff = async () => { try { await foo(); } catch (e) { console.log(e); } };
spinoff(); // no await!
}
Но я не рекомендую этот шаблон, так как он тонкий и легко пропустить.