【问题标题】:How to run function with parameters using $timeout in AngularJS?如何在 AngularJS 中使用 $timeout 来运行带参数的函数?
【发布时间】:2014-04-05 02:58:58
【问题描述】:

我的 AngularJS 控制器中有这个功能。看起来像这样;

polling_interval=1000;
var poll = function() 
{
  //Execution code
  $timeout(poll, polling_interval); 
}; 
poll();

它使用 AngularJS 中的$timeout 服务来继续调用自己。这一直有效,直到我想向这个 poll 函数添加参数。我的代码对于添加的参数如下所示;

polling_interval=1000;
var poll = function(param1, param2) 
{
  //Execution code
  $timeout(poll(param1, param2), polling_interval); 
}; 
poll(param1, param2);

语法不可接受,我现在不知所措。如何在 AngularJS 中使用 $timeout 执行带有参数的函数?如果无法做到这一点,是否有解决此问题的方法?我想让我的 poll 函数接受参数。

【问题讨论】:

  • 从 1.4.0 开始,您可以使用 $timeout([fn], [delay], [invokeApply], [Pass]); 。文档here

标签: javascript angularjs


【解决方案1】:

$timeout 是 Angular 对 window.setTimeout 的封装。自然,就像 setTimeout 一样,它支持向超时 fn 传递额外的参数。

来自 AngularJS API:

$timeout([fn], [delay], [invokeApply], [Pass]);

[fn](函数)是你的函数
[delay](数字)延迟毫秒
[invokeApply] (boolean) 默认为 true,如果为 true,则 fn 在 $apply 中运行,如果为 false,则跳过模型脏检查。
[通过]附加参数!这就是你想要的!

你的代码应该是什么样子的:

polling_interval = 1000;
var poll = function(param1, param2){
    //Execution code
    $timeout(poll, polling_interval, true, param1, param2); 
}; 
poll(param1, param2);

这是将参数传递给超时 fn 的正确方法。我希望你觉得这很有用。

编辑:此功能于 2015 年 1 月 22 日 (v1.4.1) 添加,在该版本之前,正确的方法是:

polling_interval = 1000;
var poll = function(param1, param2){
    //Execution code
    $timeout(poll.bind(null, param1, param2), polling_interval); 
}; 
poll(param1, param2);

【讨论】:

  • 最佳解决方案!我想知道如何在 1.4.1 之前执行此操作,所以再次 +1。使用匿名函数的其他解决方案可能会因为闭包而产生意外行为。
  • 使用.bind()的方法你知道为什么第一个参数必须是null吗?当我不这样做并且参数变得混乱时,它让我有点难过。
  • @Will.bind()的第一个参数是this,函数将要绑定的“上下文”。这其实就是.bind()的主要用法。使用附加参数时,您不仅绑定上下文,还绑定传递给.bind() 的尽可能多的参数,因此当您调用生成的绑定 fn 时,您使用第一个参数设置的this 调用它,以及您使用剩余参数设置的参数。 Chek Function.prototype.bind().或者也许其他人可以更准确地澄清一下
【解决方案2】:

因为$timeout的第一个参数类型是函数,所以需要这样做:

polling_interval=1000;
var poll = function(param1, param2) 
{
  //Execution code
  $timeout(function() {poll(param1, param2)}, polling_interval); 
}; 
poll(param1, param2);

【讨论】:

  • 这对我有帮助。但是请注意,只要您没有任何函数参数,它也可以在以下情况下工作:'myFunc = $timeout(someFunc(), someMilliseconds);'一旦 someFunc() 有一个参数,它就不再起作用了,必须按照你的建议做:'myFunc = $timeout(function () {someFunc(param)}, someMilliseconds);'
  • 为什么选择匿名函数而不是 bind()?
【解决方案3】:

使用匿名函数可能是最简单的方法。

polling_interval=1000;
var poll = function(param1, param2) 
{
  //Execution code
  $timeout(function () { poll(param1, param2) }, polling_interval); 
}; 
poll(param1, param2);

【讨论】:

  • 为什么选择匿名函数而不是 bind()?
猜你喜欢
  • 1970-01-01
  • 2018-06-09
  • 2019-07-05
  • 2022-11-27
  • 2021-11-08
  • 2013-06-25
  • 2016-11-13
  • 2017-09-22
  • 1970-01-01
相关资源
最近更新 更多