2016-08-16 4 views
13

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

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

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

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

Любая помощь здесь очень ценится!

+0

_ «Код выглядит так» _ Вряд ли, и поэтому вы не должны удалять 'async' и' await'. В этом примере нет смысла, но это не значит, что это бессмысленно в реальном коде. – zeroflagL

+1

Немного непонятно, что именно вы здесь задаете. Как работает кусок кода **, предположительно **, и как можно удалить «async» и «await' ** **)? Без четкого вопроса, который имеет реальный * ответ * на него, вы просто получаете очень широкий и упрямый совет. – noppa

+0

Я редактировал вопрос, чтобы сделать его более ясным, что я пытаюсь достичь. – Marta

ответ

24

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

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

Но я не рекомендую эту схему, так как это тонко и легко пропустить.

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

Я вижу downvotes, но нет комментариев, поэтому, чтобы прояснить downvotes ... Как это отвечает на вопрос вообще? А также вы даже не используете функцию 'async', о которой спрашивает этот вопрос. – aug

Смежные вопросы