1

我知道去抖动是做什么的。我想在节点中触发它(通过运行带有 的脚本#!/usr/bin/env node),但我遇到了麻烦。

下面的代码应该

  • MakedoThingAfterDelay()在它被调用一次并且在 100 毫秒内没有被再次调用后运行一个简单的函数。
  • 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

如何使去抖动功能运行?

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

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()返回一个真正的价值很重要。

4

1 回答 1

2

如果您查看debounce 函数的源代码,您会发现它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()
于 2017-06-12T11:13:22.223 回答