当前位置: 首页 > 面试题库 >

如何在AngularJS中编写反跳服务

吴炎彬
2023-03-14
问题内容

下划线库提供了一个反跳功能,该功能可防止在设定的时间内多次调用该功能。他们的版本使用setTimeout。

我们如何用纯AngularJS代码做到这一点?

此外,我们可以利用$ q样式的承诺在反跳周期之后从调用的函数中检索返回值吗?


问题答案:

这是此类服务的工作示例:http :
//plnkr.co/edit/fJwRER?p=preview。它创建了一个$q延迟对象,该对象将在最终调用去抖动功能时解决。

每次debounce调用该函数时,都会返回对内部函数的下一次调用的承诺。

// Create an AngularJS service called debounce
app.factory('debounce', ['$timeout','$q', function($timeout, $q) {
  // The service is actually this function, which we call with the func
  // that should be debounced and how long to wait in between calls
  return function debounce(func, wait, immediate) {
    var timeout;
    // Create a deferred object that will be resolved when we need to
    // actually call the func
    var deferred = $q.defer();
    return function() {
      var context = this, args = arguments;
      var later = function() {
        timeout = null;
        if(!immediate) {
          deferred.resolve(func.apply(context, args));
          deferred = $q.defer();
        }
      };
      var callNow = immediate && !timeout;
      if ( timeout ) {
        $timeout.cancel(timeout);
      }
      timeout = $timeout(later, wait);
      if (callNow) {
        deferred.resolve(func.apply(context,args));
        deferred = $q.defer();
      }
      return deferred.promise;
    };
  };
}]);

通过在promise上使用then方法,可以从去抖动的函数中获取返回值。

$scope.addMsg = function(msg) {
    console.log('addMsg called with', msg);
    return msg;
};

$scope.addMsgDebounced = debounce($scope.addMsg, 2000, false);

$scope.logReturn = function(msg) {
    console.log('logReturn called with', msg);
    var promise = $scope.addMsgDebounced(msg);
    promise.then(function(msg) {
        console.log('Promise resolved with', msg);
    });
};

如果您logReturn连续快速拨打了多次电话,您将看到logReturn一遍又一遍的通话记录,但只有一个addMsg通话记录。



 类似资料:
  • 问题内容: 我喜欢使用指令制作自定义组件。我检查了很多教程,它使我感到困惑,任何人都可以解释指令的工作原理。我计划制造的组件是 呼喊列表的模板将像这样 问题答案: 这是您的指令,带有一些内联注释: 和模板文件: 现在,您可以在代码中使用它,如下所示: 控制器: 视图: 希望这可以帮助!

  • 问题内容: 我的公司拥有数千个现有的xml Web服务,并开始为新项目采用AngularJs。 http://angularjs.org/上的教程专门使用json服务。看起来他们在控制器中进行了服务调用,解析了生成的JSON,并将生成的对象直接传递给视图。 我该如何处理XML?我看到四个选项: 解析它,然后将DOM对象直接传递到UI(view)。 在服务器端围绕我的XML服务放置一个JSON包装器

  • 问题内容: authService.getLoggedin()返回false或true取决于用户是否登录。然后,我想不允许他们进入网址,如果不允许的话。 但是我收到此错误:错误:[$ injector:modulerr]由于以下原因无法实例化模块WikiApp:[$ injector:unpr]未知提供程序:authService 问题答案: 在配置阶段,您只能要求提供程序($ routeProv

  • 问题内容: 我需要为AngularJS编写一个自定义模块,但是我找不到关于该主题的任何好的文档。如何为AngularJS编写一个可以与他人共享的自定义模块? 问题答案: 在这种情况下,您认为文档无法再为您提供帮助,一个很好的学习方法是查看其他已经构建的模块,看看其他人是如何做到的,他们如何设计架构以及如何将它们集成到其中。他们的应用。 在查看其他人的工作之后,您至少应该有一个起点。 例如,看看任何

  • 在vert. x中编写异步请求处理程序的推荐方法是什么? 在此服务中,请求处理通常涉及调用DB、调用外部服务等。但是,我不想阻止请求处理线程。使用vet实现这一目标的推荐方法是什么。十、在一个典型的异步处理链中,我将使用请求处理线程向带有请求对象的消息总线发出消息。另一个处理程序将选择此消息并进行一些处理,例如检查请求参数。然后,这个处理程序可以向总线发出一条新消息,下一个处理程序将执行远程调用,

  • 问题内容: 如何在Doctrine 2.0中编写此SQL查询(并获取结果)? 问题答案: 好吧,我发现也许是最好的解决方案: 然后是两个类( NotificationGroup 和 NotificationEvent ),它们扩展了 Notification :