javascript - javascript可以从一个要求模块中调用去抖?

  显示原文与译文双语对照的内容
109 2

我无法在 requirejs MODULE 中得到下划线去抖方法。作为替代方法,我可以以通过 windows ,进行伪抖动方法,然后手动测试计时器。

有谁创造了比这个更好的替代方案?以下是问题的jsfiddle:http://jsfiddle.net/ledlogic/gkY5C/

require.config({
paths: {
 'jquery': 'http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.7.min',
 'underscore': 'https://raw.github.com/documentcloud/underscore/master/underscore'
}
});
require(['jquery', 'underscore'], function ($, _) {
var flyStat = {
 pct: -1,
 delay: 0,
 timeout: null,
 rnd: function (i) {
 flyStat.pct = Math.random() * 100.0;
 flyStat.trns(i);
 },
//report transient state. CALLED
 trns: function (i) {
 console.log("TRNS[" + i +"]:" + flyStat.pct);
 },
//report final state, called immediately at end. CALLED
 rpt: function () {
 console.log("RPT:" + flyStat.pct);
 },
//report final state, intended to be called from debounce. NOT CALLED
 rptd: function () {
 console.log("RPTD:" + flyStat.pct);
 },
//report final state, setup timeout calls. CALLED
 rpto: function(delay) {
 if (flyStat.timeout) {
 window.clearTimeout(flyStat.timeout);
 }
 flyStat.last = (new Date()).getTime();
 flyStat.delay = delay;
 flyStat.timeout = window.setTimeout(flyStat.rpto2, delay);
 },
//report final state, called from timeout call. CALLED
 rpto2: function() {
 if (flyStat.last> flyStat.delay) {
 console.log("RPTO2:" + flyStat.pct);
 }
 }
};
//Can debounce call back into a requires define block?
//NO.
function dbc() {
 console.log("DBC: 1");
}
_.debounce(dbc, 10);
//Run a semi-lengthy running process (because of the console log activity, it lags a bit).
for (var i = 0; i <1000; i++) {
 flyStat.rnd(i);
//We want a debounced report, after 1 sec past the last one
//Do we get it?
//NO.
 _.debounce(flyStat.rptd, 1000);
//Can we resort to classic timeout?
//YES.
 flyStat.rpto(1000);
//Is there a better way?
//UNKNOWN.
}
//Immediate call at end (assumes we have sequential process with fixed known length and endpoint).
//Does this work?
//YES.
flyStat.rpt(); 
});
时间:原作者:0个回答

70 0

debounce 文档表明debounced函数是debounce 返回的那个函数:

创建和计算返回所传递函数的新版本

下面是文档中的示例:

var lazyLayout = _.debounce(calculateLayout, 300);
$(window).resize(lazyLayout);

注意使用( lazyLayout )的回调是 debounce的返回值。问题中的代码不使用来自 debounce的返回值,因此它不工作。

RequireJS在这一点上根本没有轴承。

下面是如何使用它的示例,基于 flyStat.rptflyStat.rptd的问题:

//Define flyStat but don't define rptd right away
var flyStat = {
[...]
};
//Create the debounced version of rpt.
flyStat.rptd = _.debounce(flyState.rpt, 1000);
for (var i = 0; i <1000; i++) {
 flyStat.rnd(i);
//Call the debounced version.
 flyStat.rptd();
}

这是一个工作的 fiddle,从你的forked 。注意,下划线必须是 shimmed 才能正确使用 RequireJS 。( 这个问题与你使用 debounce的问题无关),你的没有工作。另外,1.8之前的jQuery版本无法识别amd类型加载器( 像 RequireJS ) 。因此,除非有一个有说服力的理由使用旧版本,使用最新版本。如果你必须使用一个不能识别RequireJS的旧版本,你必须重新输入它,它。

( for: 我从megawac的注释中看到,项目的github分支中下划线版本的下划线是支持AMD的。然而,这个版本似乎还没有发布。除非有真正引人注目的理由,否则我宁愿不要使用开发版本。我关于下划线需要 shim的评论保留在这个日期发布的下划线版本中。假设下一个版本不需要 shim 。

原作者:
...