Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/439.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在JavaScript中,如何从其事件函数内部访问setTimeout/setInterval调用的id?_Javascript_Settimeout_Setinterval - Fatal编程技术网

在JavaScript中,如何从其事件函数内部访问setTimeout/setInterval调用的id?

在JavaScript中,如何从其事件函数内部访问setTimeout/setInterval调用的id?,javascript,settimeout,setinterval,Javascript,Settimeout,Setinterval,当Java线程可能访问自己的线程id时,如何从其事件函数内部访问setTimeout/setInterval调用的进程id var id = setTimeout(function(){ console.log(id); //Here }, 1000); console.log(id); 该代码将按原样工作,因为在调用提供的回调之前,setTimeout将始终返回,即使您传递的超时值非常小、为零或为负 > var id = setTimeout(function(){

当Java线程可能访问自己的线程id时,如何从其事件函数内部访问setTimeout/setInterval调用的进程id

var id = setTimeout(function(){
    console.log(id); //Here
}, 1000);
console.log(id);

该代码将按原样工作,因为在调用提供的回调之前,
setTimeout
将始终返回,即使您传递的超时值非常小、为零或为负

> var id = setTimeout(function(){
      console.log(id);
  }, 1);
  undefined
  162
> var id = setTimeout(function(){
      console.log(id);
  }, 0);
  undefined
  163
> var id = setTimeout(function(){
      console.log(id);
  }, -100);
  undefined
  485

问题是,我计划有许多并发调度的匿名操作,所以它们不能从同一个变量加载id

当然可以

(function () {
  var id = setTimeout(function(){
    console.log(id);
  }, 100);
})();

传递给
setTimeout
的函数不知道这一事实。这不是进程id或线程id,只是一个奇怪的API决定。

什么进程id?没有单独的进程。setTimeout是否生成线程?该代码按原样工作@莱洛曼:不,当然不是。JS没有线程。这是正确的方法,它对我来说很好(但它不是一个进程)。无论如何,JavaScript!==爪哇@lelloman如果你出于某种原因想要分开的线程,你总是有网络工作者。这根本不是一个奇怪的API决定。它是一个用于稍后取消超时的句柄。是的,通过执行
var l=100000,可以取消所有超时,这并不奇怪;而(l--)清除超时(l)
。即使使用最重的包装器,也无法修复它。这能解决什么问题?问题是我计划有许多并发计划的匿名操作,因此它们无法从同一个变量加载id。@user1636586所以将它们的id推到数组中,并在数组中迭代以清除它们。@user1636586有一个简单的修复方法。看我的编辑。谁在说清除它们?我只想在这些操作运行时按id宣布它们//如果我从不同的执行块部署计时器,似乎可以得到我想要的结果。(function(){var id=setTimeout(function(){console.log(id);},3000);console.log(id);})();(function(){var id=setTimeout(function(){console.log(id);},2000);console.log(id);})();(function(){var id=setTimeout(function(){console.log(id);},1000);console.log(id);})();
// Creates timeout or interval based on parameters:
// timeoutOrInterval: string, 'timeout' or 'interval'
// worker: function, worker with signature function(procRef)
// timeout: int, timeout in ms
// context: optional, window object (default is 'window'), can be a window of an iframe, for istance
// see usage below
function makeTimeoutOrInterval(timeoutOrInterval, worker, timeout, context){
  var isTimeout = (timeoutOrInterval == 'timeout'), method = isTimeout ? 'setTimeout': 'setInterval',id, result = getObjectFor(id = (context || window)[method](function(){
    worker.call(this, (result = getObjectFor(id, isTimeout)));
  }, timeout), isTimeout);
  return result;
  function getObjectFor(id, isTimeout) {
    return {
        getId: function() { return id; },
        cancel: function() {
          if (id) {
            if (isTimeout)
                window.clearTimeout(id);
            else
                window.clearInterval(id);
            id = null;
          }
        }
    };
  }
}

// Usage:
var counter = 0;
var procRefOuter = makeTimeoutOrInterval('interval', function(procRef){
    // procRef - object with two methods: getId() and cancel() - to get and id of a worker process or cancel execution
    console.log(procRef.getId());
    console.log ('Counter: ' + (counter++));
    if (counter == 10) {
        procRef.cancel(); // we can cancel further execution inside the worker
    }
}, 2000);

procRefOuter is exactly the same as procRef explained earlier. Only outside.

console.log(procRefOuter.getId());