为了限制对API的请求,我制作了一种方法,每个时间间隔只允许一定数量的请求。
它有效,但是我想要setTimeout
部分。
我已尝试setTimeout(fn.apply, self.sleepTime(), null, fn_arguments)
和setTimeout(fn.bind(fn_arguments), self.sleepTime())
。
所以我想知道的是,我是否可以将fn
传递给setTimeout
而不将其包含在function
中?
function (fn) {
var self = this;
return function () {
var fn_arguments = arguments;
setTimeout(function () {
fn.apply(null, fn_arguments);
}, self.sleepTime());
};
};
var args;
function fn () {
document.write(JSON.stringify(arguments), ' ~ ', JSON.stringify(arguments) === JSON.stringify(args));
document.write('<br>');
}
(function() {
args = arguments;
fn('hello', 'world'); // { '0': 'hello', '1': 'world' } ✓
fn.bind.apply(fn, [null].concat(arguments))(); // { '0': { '0': 'hello', '1': 'world' } }
fn.bind.apply(fn, Array.prototype.slice.call(arguments))(); // { '0': 'world' }
fn.bind.apply(fn, [null].concat(Array.prototype.slice.call(arguments)))(); // { '0': 'hello', '1': 'world' } ✓
}('hello', 'world'));
&#13;
答案 0 :(得分:2)
关闭!你只需要结合第二步和第三步:
fn.bind.apply(fn, [null].concat(Array.prototype.slice.call(arguments)))();
答案 1 :(得分:0)
您可以使用bind创建一个包含函数参数的函数,并在setTimout调用中使用它。但是,bind不接受单个参数数组,而是使用多个逗号分隔的参数。要解决此问题,可以在bind函数上调用apply,如下所示:
setTimeout(fn.bind.apply(fn, [null].concat(fn_arguments)), self.sleepTime())
编辑:您必须确保fn_arguments
是一个数组,例如通过var fn_arguments = Array.prototype.slice.call(arguments);