通过fn.apply或fn.bind将函数传递给setTimeout

时间:2015-03-18 14:36:48

标签: javascript node.js

为了限制对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;
&#13;
&#13;

2 个答案:

答案 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);

转换参数对象