我在角度中使用$ timeout服务,每1/10秒将变量从100减少到1。
我知道有一种更简单的方法可以使用$ interval服务来完成这项工作,而且我已经完成了。但是,在这里,具体来说,我正在测试角度回调 - 并没有真正尝试将变量从100减少到每1/10秒1次。
具体来说,我希望在$ timeout函数休眠时调用回调(1/10秒)
我的问题是为什么我得到一个"未定义的不是一个函数"使用回调时出错。我在下面包含了JS代码。它也在JSbin here
上这是JS代码:
var testApp = angular.module('testApp', []);
testApp.controller('testCtrl', ['$scope', '$timeout', function($scope, $timeout) {
var q = 100;
function decreaseQ(callback) {
$scope.someThing = q;
if(q>0){ $timeout(decreaseQ, 100);q--;}
callback();
}
decreaseQ(function(){console.log("Hello World");});
}]);
答案 0 :(得分:3)
这是因为在第一次调用带有函数参数的decreaseQ
之后,你通过在超时中设置它来调用decreaseQ
而没有任何参数。但是你期望一个回调并调用函数{{ 1}}导致错误。
相反,您只需将该函数作为回调函数传递。
decreaseQ()
或使用绑定功能
if (q-- > 0) {
$timeout(function() {
decreaseQ(callback); //Pass the callback as argument
}, 100);
}
或者如果没有通过添加支票提供回调,就不要运行。
$timeout(angular.bind(null, decreaseQ, callback), 100);
或使用虚拟匿名函数
if(angular.isFunction(callback)) { callback(); }