Есть ли возможность ввести что-либо после выполнения функции тайм-аута - PullRequest
0 голосов
/ 04 октября 2018

Например, у нас есть такой код:

    let a = 0;
    setTimeout(()=>{a++},0);
    console.log(a);

Как я понимаю, все в обратном вызове тайм-аута будет выполнено после того, как будут выполнены все функции стека вызовов, и только тогда timeoutCallback перейдет в стек выполнения из'queue'.

Мой вопрос: есть ли возможность ввести что-либо после выполнения функции timeout и получить результат от обратного вызова timeout?(без ожидания, когда весь стек выполнения опустеет)

примерно так:

    let a = 0;
    setTimeout(()=>{a++},0);
    console.log(a);  // 0
    //some mystery things happened
    console.log(a); // 1

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

Есть ли возможность ввести что-либо после выполнения функции тайм-аута

Это вопрос безопасности / неизменности?Поскольку ваша ссылка на переменную a является примером замыканий и может быть изменена из нескольких мест.

let a = 0;
setTimeout(()=>{a++},0);
console.log(a);  // 0
    
a++              //some mystery things happened (ie Closures)
    
console.log(a);  // 1

Если вы хотите сохранить, a от непреднамеренного влияния других частей кода, используйте неизменные идентификаторы (например, const) или передайте увеличенное значениеиспользуя функции высшего порядка.

0 голосов
/ 04 октября 2018

Вы не можете получить код обратно из очереди тайм-аут, как только он будет отправлен туда.Вместо этого переместите код в функцию-обработчик и отправьте его в очередь тайм-аута.Затем вы можете сохранить setTimeout как переменную, а позже вы можете уничтожить тайм-аут до его запуска и сразу же запустить функцию.

let a = 0
function timeoutHandler() {
  a++
  console.log("Counted to " + a)
}

var timeout = setTimeout(timeoutHandler,10000)

clearTimeout(timeout)
timeoutHandler()
...