setTimeout передает себя в качестве аргумента - PullRequest
0 голосов
/ 08 ноября 2018

Я хочу передать идентификатор текущего таймаута функции, которую он выполняет.

function test(timeout){       
  console.log(timeout)
}

setTimeout(test,1000,"timeout object") //how to pass a refrence to the current timeout object or id

редактирование:

  • Тайм-аут может быть объектом (ES6) или числом, в любом случае я хочу ссылку на него
  • Я не хочу объявлять тайм-аут как глобальную переменную, я просто хочу передать его в качестве аргумента

Ответы [ 5 ]

0 голосов
/ 08 ноября 2018

Этого можно добиться, манипулируя контекстом this вашей функции test(), вызываемой setTimeout.Вы хотите использовать свойство объекта, а не переменную для передачи ссылки на тайм-аут, потому что выполнение будет происходить асинхронно.

function delay(){ 
  var obj = {};
  obj.timeout = setTimeout(test.bind(obj), 1000) 
} 
function test() { 
  console.log(this.timeout); 
} 
delay();

Кроме того, вы можете просто передать объект в качестве третьего параметра в функцию setTimeout, например:

function delay(){ 
  var obj = {};
  obj.timeout = setTimeout(test, 1000, obj) 
} 
function test(param) { 
  console.log(param.timeout); 
} 
delay();
0 голосов
/ 08 ноября 2018

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

Также @Velimir Tchatchevsky ответ лучше всего использовать. Раствор обертки должен быть излишним.

function setTimeoutWrapper(func, time) {
  const ref = setTimeout(() => {
    func(ref);
  }, time);
}

setTimeoutWrapper((timeoutReference) => {
    console.log('timeoutReference = ', timeoutReference);
}, 1000);

Также я не вижу смысла передавать ссылку на функцию, потому что если вы находитесь в функции, это означает, что она вызывается. Так что там нет необходимости clearTimeout.



Избыточное веселье - это весело:

function setTimeoutWrapper(func, time, ...args) {
  const ref = setTimeout(() => {
    func(ref, ...args);
  }, time);
}

setTimeoutWrapper((timeoutReference, p1, p2) => {
  console.log('timeoutReference = ', timeoutReference);
  console.log('p1 = ', p1);
  console.log('p2 = ', p2);
}, 1000, 'I am a parameter', 'second param');

А как насчет некоторого ИИФЭ, а не глобальной переменной?

(() => {
  const ref = setTimeout(() => {
    console.log('timeoutReference = ', ref);
  }, 1000);
})();

console.log('Is there a global variable ?', ref);

с внешней функцией

function func(ref) {
  console.log('reference : ', ref);
}

(() => {
  const ref = setTimeout(() => func(ref), 1000);
})();

console.log('Is there a global variable ?', ref);
0 голосов
/ 08 ноября 2018

var myTimeout = setTimeout(test, 1000, "timeout object")

function test(timeout) {
  console.log(myTimeout);
}

Теперь, когда myTimeout является ссылкой на ваше время ожидания, вы можете использовать его, чтобы отменить его с помощью window.clearTimeout(myTimeout) или использовать его для любых целей.

0 голосов
/ 08 ноября 2018

Технически функция setTimeout() возвращает идентификатор, сохраняет его в переменной и передает его.

function test(timeout) {
  console.log(timeout2)
}

var timeout2 = setTimeout(test, 1000)

Редактировать: В зависимости от среды, в которой вы ее выполняете, иногда вы не можете использовать переменную до ее объявления (т. Е. Класса ES6). Вам придется позаботиться об этом.

0 голосов
/ 08 ноября 2018

Вы можете сохранить ссылку на тайм-аут в переменной, которая будет доступна внутри переданной функции.

var timeoutReference = setTimeout(function(){
    console.log('do something with the timeout reference');
    console.log('timeoutReference = ',timeoutReference);
}, 1000);
...