【问题标题】:Angularjs override (cancel) timeout if already existAngularjs 覆盖(取消)超时(如果已经存在)
【发布时间】:2019-11-12 17:18:04
【问题描述】:

我有服务

devApp.factory('flashFactory',['$timeout',function($timeout){
    var flashFactory = {};
    flashFactory.request = function($scope,variable){
        $timeout(function(){
            delete $scope[variable];
        },5000);
    }
    return flashFactory;
}]);

可以删除指定作用域的变量, 我使用上述服务在消息创建 5 秒后从变量中删除消息,每当在同一范围变量中创建新消息时,它需要等待 5 秒后它应该删除,但问题是当有任何先前的超时工作时在同一个范围变量上,它应该被新的超时覆盖,所以消息必须显示 5sec ,任何人都可以帮助我,谢谢。

【问题讨论】:

    标签: javascript angularjs angularjs-service


    【解决方案1】:

    保存$timeout返回的promise,并用它来取消之前的$timeout:

    devApp.service('flashFactory',function($timeout){
        var promiseCache = {};
        this.request = function request($scope,variable){
            var id = $scope.$id + variable;
            promiseCache[id] && $timeout.cancel(promiseCache[id]);
            promiseCache[id] = $timeout(function(){
                delete $scope[variable];
            },5000);
        }
    });
    

    服务根据作用域的$id 和变量的名称制作一个ID。它存储了$timeout 返回的promise,并用它来取消之前的$timeout

    有关详细信息,请参阅

    【讨论】:

      【解决方案2】:

      我在这里完全失明,根据假设写了这个答案,并在使用前尝试理解这个sn-p!

      devApp.factory('flashFactory', ['$timeout', function($timeout) {
          var flashFactory = {};
          flashFactory.timeoutArr = [];
          flashFactory.request = function($scope, variable) {
              flashFactory.timeoutArr.ifFindThenDelete(variable, $timeout);
              var timeOutObj = {};
              timeOutObj.myvar = variable;
              timeOutObj.fn = $timeout(function() {
                  delete $scope[variable];
              }, 5000);
              flashFactory.timeoutArr.push(timeOutObj);
      
          }
          return flashFactory;
      }]);
      
      
      Array.prototype.ifFindThenDelete = function(variable, $timeout) {
          var i = this.length
          while (i--) {
              if (this[i].myvar == variable) {
                  $timeout.cancel(this[i].fn)
                  this.splice(i, 1);
              }
          }
      }; 
      

      【讨论】:

        猜你喜欢
        • 2017-10-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-10
        • 1970-01-01
        • 2021-07-09
        • 2017-10-06
        • 2021-02-10
        相关资源
        最近更新 更多