使用带有参数的函数的$ timeout,AngularJS fn不是函数错误

Cat*_*ish 8 javascript angularjs

我正在创建一个可以编辑文本的网页,在您停止输入1秒后,它将自动保存您输入的内容.

目前我正在研究$ timeout细节.当我调用update没有参数的方法时,我有它工作,但当我用params调用它时,我得到错误:

Error: fn is not a function $TimeoutProvider/this.$get</timeout/timeoutId<@http://localhost:63342/express_example/bower_components/angular/angular.js:14014 completeOutstandingRequest@http://localhost:63342/express_example/bower_components/angular/angular.js:4300 Browser/self.defer/timeoutId<@http://localhost:63342/express_example/bower_components/angular/angular.js:4601
Run Code Online (Sandbox Code Playgroud)

为什么我在执行此操作时出现此错误:

timeout = $timeout(update(element, content), 1000);
Run Code Online (Sandbox Code Playgroud)

但不是我这样做的时候:

timeout = $timeout(update, 1000);
Run Code Online (Sandbox Code Playgroud)

显然我需要将params传递给update方法,因为我需要知道要更新的内容.

debounceUpdate($(this), data.content);

var debounceUpdate = function(element, content) {
    console.log('in debouce');
    if (timeout) {
      $timeout.cancel(timeout);
    }

    timeout = $timeout(update(element, content), 1000);
};

// Update an existing section
var update = function(element, content) {
    console.log('in update');
    console.log('section_id to update is '+element.data('sectionId'));
    console.log(content);
}
Run Code Online (Sandbox Code Playgroud)

Dar*_*con 13

您的代码update立即调用并尝试将其返回值作为$timeout回调传递.你真的想从$timeout处理程序调用更新:

timeout = $timeout(function() {update(element, content);}, 1000);
Run Code Online (Sandbox Code Playgroud)

  • `update(element,content)`调用`update`.马上.所以`$ timeout(update(element,content),1000)`立即调用`update`,然后将其作为第一个参数的返回值传递给`$ timeout`,这也是马上调用的. (4认同)
  • `function(){update(element,content);}`创建一个闭包,当被调用时,它调用`update`.`$ timeout(function(){update(element,content);},1000)`立即调用`$ timeout`并将该闭包作为第一个参数传递.`$ timeout`等待一段时间,然后调用闭包,调用`update`. (2认同)