如何从节点命令行运行去抖动功能?

时间:2017-06-12 10:51:06

标签: node.js lodash debounce

我知道debounce的作用。我想在节点中触发它(通过运行带有#!/usr/bin/env node的脚本),但我遇到了麻烦。

下面的代码

  • 使doThingAfterDelay()在调用一次之后运行一个简单的函数,而不再被调用100ms。
  • 运行doThingAfterDelay()
  • 睡眠(异步)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

如何让debounced功能运行?

编辑:我可以通过以下方式获得所需的输出:

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()返回实际值非常重要。

1 个答案:

答案 0 :(得分:2)

如果您查看debounce function的源代码,可以发现它使用了setTimeout,因此具有相同的机制。在执行去抖动函数后,您可以使用回调或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()