#javascript #timeout #settimeout #setinterval #intervals
#javascript #тайм-аут #settimeout #setinterval #интервалы
Вопрос:
Я хочу получить данные интервала или тайм-аута через его идентификатор. Точно так же, document.getElementById('id-of-random-element')
как получить все данные по этому конкретному элементу, я хочу знать, есть ли какой-либо способ получить данные, которые изначально были установлены для тайм-аута или интервала по его идентификатору.
Например:
var a = setInterval(()=>{console.log("abcdef");},1000)
//below is some serious pseudo code
getIntervalById(a) //returns something like (()=>{console.log("abcdef");},1000)
Комментарии:
1. Интервальные таймеры не возвращают ничего, кроме числового идентификатора, используемого для их очистки. Какую проблему более высокого уровня вы пытаетесь решить?
2. точно так же, как вы могли бы видеть множество данных элемента (для этого конкретного) и, возможно, даже редактировать с помощью
document.getElement
типа кода, я хочу иметь возможность видеть этот объем данных из тайм-аута или интервала, который был установлен. И да, я знаю, что он возвращает только своего рода «идентификатор». Это y, о чем я здесь спрашиваю3. На какие данные вы ссылаетесь и каков был бы ваш практический вариант использования? Пока все, что у вас есть, — это проблема XY
4. и что касается того, какую проблему я пытаюсь решить, я имею в виду .. это спрашивают только тогда, когда неясно, чего хочет человек.. Как я был неясен? то, что я хочу, да, вероятно, чрезвычайно сложно, но, по крайней мере, есть ли способ получить функцию, которая была передана в определенный тайм-аут или интервал по определенному идентификатору
a
5. Нет, если только вы не должны были сохранить ссылку на него в объекте или самостоятельно отобразить, используя идентификатор в качестве ключа
Ответ №1:
Одна вещь, которую вы могли бы рассмотреть, это перегрузить таймеры, чтобы вы могли перехватывать их и сохранять все, что захотите
Простой пример с setTimeout
const origTime = window.setTimeout;
setTimeout = function(...args) {
const id = origTime(...args);
// do something with arguments and id
console.log('id:', id, 'delay:', args[1]);
return id
}
let id = setTimeout(() => console.log('wtf'), 1000);
setTimeout(() => console.log('foobar'), 2000)
console.log('external id', id)
Комментарии:
1. кстати, как … связать аргументы подобным образом?
2. Распространяется ли ES6 …. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference /…
Ответ №2:
Расширяя другой ответ
var inters = []
Object.defineProperties(window, {
getAllIntervals: {
get: function () {
return inters
}
}
})
var old= setInterval
setInterval = function () {
var oldId= old.apply(this, arguments)
inters[oldId] = arguments//[fnc, time]
}
Затем всякий раз, когда вы можете setInterval, вы можете позже вызвать getAllIntervals, чтобы получить список интервалов, отображенных us lidz, и проанализировать функцию с помощью .toString() , или получить определенный интервал с getAllIntervals[INTERVAL_ID]
Комментарии:
1. хотя ваш ответ кажется более сложным, он по-прежнему правильный (дело в том, что чувак ниже, которого я видел, работал над ним первым)
2. но все же, пожалуйста, не удаляйте свой ответ. Меня интересует ваш метод