как clearTimeout на самом деле очищает время ожидания? - PullRequest
0 голосов
/ 19 апреля 2020

Мы сохраняем ссылку setTimeout, чтобы иметь возможность отменить ее в будущем. когда мы вызываем clearTimeout

, он немедленно выведет его из очереди обратного вызова

или

будет ждать очереди обратного вызова и предотвратить его запуск в этот момент времени

вот пример, чтобы уточнить, что я имею в виду;

var a = setTimeout(()=>console.log("a"),1000);
var b = setTimeout(()=>console.log("b"),2000);

let isCancelled = false;

var c = setTimeout(()=>console.log("c"),2000);
var d = setTimeout(()=>{
  if(!isCancelled)
   console.log("d")
},2000);


clearTimeout( c ); // "c" won't show
isCancelled = true; // "d" won't show too

моя интуиция заключается в том, что каким-то образом (например, с помощью флага или чего-то еще) он будет ждать своей очереди и не будет запускаться, вместо того, чтобы немедленно удалять его из очереди, так как он очередь и поиск элемента требуют посещения всех элементов до тех пор, пока он не найдет элемент, который в худшем случае равен O(n), затем удалит элемент, исправит указатели (например, двойные списки ссылок), и здесь мы go удалили его немедленно; Но это неэффективно, так как это должно происходить в самых основных частях языка (событие l oop и другие вещи), где мало времени, а предотвращение этого будет O(1) просто оператором if; но ждать своей очереди некрасиво и не кажется таким умным;


Итак что вы думаете, ребята? который из? или, может быть, другой подход к этому?

заранее спасибо;

Ответы [ 2 ]

1 голос
/ 19 апреля 2020

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

Однако обратите внимание, что даже для установки флага в структуре данных, содержащей обратный вызов, потребуется найти Правильный экземпляр таймера в очереди (с использованием идентификатора, который вы передаете clearTimeout), поэтому он может не сильно отличаться по сложности. Единственным отличием было бы управление памятью.

, поскольку это очередь, и для поиска элемента необходимо посетить все элементы, пока не найдет его, а в худшем случае - O(n)

Нет, это зависит от структуры данных, используемой для очереди. Не все очереди реализованы как связанные списки. Я бы ожидал гораздо более эффективного.

0 голосов
/ 19 апреля 2020

Спецификация говорит :

Методы clearTimeout () и clearInterval () должны очистить запись, идентифицированную как дескриптор, из списка активных таймеров объекта WindowOrWorkerGlobalScope, для которого метод был вызван, если есть, где handle это аргумент, переданный методу. (Если дескриптор не идентифицирует запись в списке активных таймеров объекта WindowOrWorkerGlobalScope, для которого был вызван метод, метод ничего не делает.)

Поэтому необходимо удалить его из список.

...