Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/477.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 如何在JS中使用事件循环来构造去盎司函数?_Javascript - Fatal编程技术网

Javascript 如何在JS中使用事件循环来构造去盎司函数?

Javascript 如何在JS中使用事件循环来构造去盎司函数?,javascript,Javascript,我试图构造一个去盎司函数定义来给出以下结果。我下面的代码打印以下内容 'hi' 'hi' 'hi' 'hi' 我正在努力弄清楚如何利用interval将x包含为未定义的,一旦该函数再次过期,该函数将返回'hi' function debounce(callback, interval) { return () =>{ let x = callback(); setTimeout(()=>{ x = callback(); },interval);

我试图构造一个去盎司函数定义来给出以下结果。我下面的代码打印以下内容

'hi'
'hi'
'hi'
'hi'
我正在努力弄清楚如何利用
interval
x
包含为
未定义的
,一旦该函数再次过期,该函数将返回
'hi'

function debounce(callback, interval) {
  return () =>{
    let x = callback();
    setTimeout(()=>{
    x = callback();
    },interval);
    return x;
  }
}

// Expectation running below statements
function giveHi() { return 'hi'; }
const giveHiSometimes = debounce(giveHi, 3000);

console.log(giveHiSometimes()); // -> 'hi'
setTimeout(function() { console.log(giveHiSometimes()); }, 2000); // -> undefined
setTimeout(function() { console.log(giveHiSometimes()); }, 4000); // -> undefined
setTimeout(function() { console.log(giveHiSometimes()); }, 8000); // -> 'hi'

创建一个
calledRecently
标志,当超时回调运行时,该标志将设置为true。当超时回调运行时,将间隔达到后运行的另一个超时设置为立即将调用的
重置为false:

函数去盎司(回调,间隔){
让calledrectly=false;
让它有效;
return()=>{
const result=calledRecently?未定义:callback();
calledRecently=true;
clearInterval(intervalId);
intervalId=setTimeout(()=>{
calledRecently=false;
},间隔);
返回结果;
}
}
const givehismomes=debounce(()=>hi',3000);
console.log(giveHiSometimes());//->'嗨
setTimeout(function(){console.log(giveHiSometimes());},2000);//->未定义
setTimeout(function(){console.log(giveHiSometimes());},4000);//->未定义

setTimeout(function(){console.log(giveHiSometimes());},8000);/->'您好,
听起来好像您正在跟踪初始事件被触发的位置,但在它被取消通知后,批处理事件被取消

有几种编写方法,包括
setTimeout
Date。现在
但归根结底是将某种类型的
lastTtrent
变量移到闭包之外,并且除非冷却时间已过,且未尝试调用函数,否则不会重新触发回调。在我看来,不使用
setInterval
编写它似乎更干净

我还将向从
leadingDebounce
函数返回的函数添加一个
…args
参数。如果需要,可以将参数传递到函数中

const leadingDebounce=(fn,冷却)=>{
设lastTrupt=0;
返回(…参数)=>{
if(Date.now()-lastTrupt>冷却){
fn(…args);
}
lastTrupt=Date.now();
};
};
const debounced=leadingdebounced(()=>console.log(“hi”),3000);
去抖动();/->'嗨
setTimeout(()=>console.log(debounced()),2000);//->未定义
setTimeout(()=>console.log(debounced()),4000);//->未定义

setTimeout(取消公告,8000);//->您好
感谢您提出类似的问题。这确实帮助我更好地理解。