【问题标题】:How can I run a debounced function from node command line?如何从节点命令行运行去抖动功能?
【发布时间】:2017-11-13 19:43:13
【问题描述】:

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

下面的代码应该:

  • 使doThingAfterDelay() 运行一个简单的函数,该函数在被调用一次并且在 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() 返回一个实际值很重要。

【问题讨论】:

    标签: node.js lodash debounce


    【解决方案1】:

    如果您查看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()
    

    【讨论】:

    • 基本上去抖函数(以及setTimeout)不能那样工作。在延迟函数被执行之前,你不能停止同步代码(除非你正在使用等待/异步)。
    • 不,如果延迟调用,它不会返回值。
    • 我想,通过玩,我更了解这个答案。主要是要有一个运行_.debounce() 的Promise,就像在delayedPromise() 中一样。我将稍微调整您的答案,使其更像问题,但谢谢!
    • 不客气,一般来说,你的代码的其他部分应该知道去抖函数何时完成,这就是回调和承诺的目的。
    • 干杯。我经常使用 Promises 和回调,但很难理解它们与 _.debounce 的关系。再次感谢,祝您有美好的一天!
    猜你喜欢
    • 2015-07-25
    • 2016-11-12
    • 1970-01-01
    • 2017-04-21
    • 2016-07-07
    • 2015-03-03
    • 1970-01-01
    • 1970-01-01
    • 2012-01-06
    相关资源
    最近更新 更多