我怎样才能从节点命令行运行一个去抖动function?

我知道什么是反弹 。 我想在节点中触发它(通过使用#!/usr/bin/env node运行脚本),但是我遇到了麻烦。

下面的代码应该

  • make doThingAfterDelay()在被调用一次之后运行一个简单的函数,而不被再次调用100ms。
  • 运行doThingAfterDelay()
  • 睡眠(asynchronous)15秒,给doThingAfterDelay()时间去抖动,因此执行。

但是它不起作用:

 var log = console.log.bind(console), _ = require('lodash') var doThingAfterDelay = _.debounce(function(){ return 'foo' }, 100); log(doThingAfterDelay()); setTimeout(function(){ log('Sleeping') }, 15 * 1000) 

它返回:

 undefined Sleeping 

我期望:

 foo Sleeping 

我怎样才能使去抖function运行?

编辑:我可以得到所需的输出:

 var log = console.log.bind(console), _ = require('lodash') var doThingAfterDelay= _.debounce(function(){ log('foo') }, 100); doThingAfterDelay('one', 'two'); setTimeout(function(){ log('Sleeping') }, 15 * 1000) 

但是我不明白为什么 – doThingAfterDelay()返回一个真正的值是很重要的。

如果你看看debounce函数的源代码,你可以发现它在引擎盖下使用setTimeout ,因此具有相同的机制。 在执行debounced函数之后,你可以使用callback函数或Promise来传递值(如果你正在使用Promise,你可以使你的代码看起来与async / await更加同步)。

 var log = console.log.bind(console), _ = require('lodash') var delayedResults = new Promise(function(resolve) { _.debounce(function(){ resolve('foo'); }, 100)(); }); var start = async function(){ log(await delayedResults ) } start()