Допустимо ли использование async в setTimeout?

У меня была асинхронная функция в Javascript, и я добавил к ней setTimeout. Код выглядит так:

        let timer;
        clearTimeout(timer);
        timer =setTimeout(() => {
        (async() => {
            await this._doSomething();
        })();
        }, 2000);

куколка setTimeout должна добавить 2 секунды до запуска функции. Он должен быть уверен, что пользователь перестал печатать.

должен ли я удалить async / await из этой функции сейчас, так как setTimeout все равно асинхронен?

любая помощь высоко ценится!

2 ответов


setTimeout добавляет задержки до вызов функции, тогда как async/await синтаксический сахар на вершине обещаний, способ цепочки кода для запуска после вызов завершается, поэтому они разные.

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!
}

но я не рекомендуем образец, так как он тонкий и может быть легко пропустить.


/* contrived example alert */
var foo = 'poo';
function setFoo(callback) (
    setTimeout(function(){
        foo = 'bar';
        callback();
    }, 100);
);
setFoo(function() {
    alert(foo);
});