如何在AngularJS中使用$ timeout运行带参数的函数?

use*_*486 22 javascript angularjs

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

polling_interval=1000;
var poll = function() 
{
  //Execution code
  $timeout(poll, polling_interval); 
}; 
poll();
Run Code Online (Sandbox Code Playgroud)

它使用$timeoutAngularJS中的服务来保持自己的调用.这有效,直到我想为此poll函数添加参数.对于添加的参数,我的代码看起来像这样;

polling_interval=1000;
var poll = function(param1, param2) 
{
  //Execution code
  $timeout(poll(param1, param2), polling_interval); 
}; 
poll(param1, param2);
Run Code Online (Sandbox Code Playgroud)

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

ale*_*tti 47

$ timeout是Angular的window.setTimeout包装器.当然,就像setTimeout一样,它支持将附加参数传递给timed-out fn.

来自AngularJS API:

$timeout([fn], [delay], [invokeApply], [Pass]);
Run Code Online (Sandbox Code Playgroud)

[fn](函数)是你的函数
[延迟](数字)以ms为单位的延迟
[invokeApply](布尔值)默认为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);
Run Code Online (Sandbox Code Playgroud)

这是将参数传递给超时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);
Run Code Online (Sandbox Code Playgroud)

  • @Will第一个参数`.bind()`是`this`,"context",函数将被绑定.这实际上是`.bind()`的主要用法.当使用附加参数时,你不仅要绑定上下文,而且在传递给`.bind()`时绑定尽可能多的参数,所以当你调用生成的绑定fn时,你用你设置的`this`来调用它.第一个参数,以及你用其余参数设置的参数.Chek [Function.prototype.bind()](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_objects/Function/bind).也许其他人可以更准确地澄清 (3认同)

xia*_*boa 32

因为$timeoutis函数的第一个参数类型,你需要这样做:

polling_interval=1000;
var poll = function(param1, param2) 
{
  //Execution code
  $timeout(function() {poll(param1, param2)}, polling_interval); 
}; 
poll(param1, param2);
Run Code Online (Sandbox Code Playgroud)


小智 9

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

polling_interval=1000;
var poll = function(param1, param2) 
{
  //Execution code
  $timeout(function () { poll(param1, param2) }, polling_interval); 
}; 
poll(param1, param2);
Run Code Online (Sandbox Code Playgroud)