angularjs之$timeout指令详解


Posted in Javascript onJune 13, 2017

angular.js的$timeout指令对window.setTimeout做了一个封装,它的返回值是一个promise对象.当定义的时间到了以后,这个promise对象就会被resolve,回调函数就会被执行.

如果需要取消一个timeout,调用$timeout.cancel(promise)方法.

用法:

$timeout(fn, [delay], [invokeApply]);

fn: 回调函数(必填)

delay: number类型.延迟的时间(非必填),如果不填,表示等线程空下来以后就执行.比如当页面被渲染完成后.

invokeApply: 布尔值.是否需要进行脏值检测(非必填),不填默认为false,如果设置为true,则fn回调会被包在$scope.$apply()中执行

返回值: 返回一个promise对象.当定义的时间到了以后,这个promise对象就会被resolve.resolve的值就是fn回调函数的返回值

方法:

$timeout.cancel([promise])

promise: 一个由$timeout()所创建的promise对象.(非必填).调用cancel()以后,这个promise对象就会被reject.

返回值: 如果$timeout()的回调还没有被执行,那就取消成功.返回true

下面来简单的测试一下:

var timeoutApp = angular.module('timeoutApp',[]);
   timeoutApp.run(function($timeout){
     var a = $timeout(function(){
       console.log('执行$timeout回调');
       return 'angular'
     },1000);
     a.then(function(data){
       console.log(data)
     },function(data){
       console.log(data)
     });
     //$timeout.cancel(a);
   })

运行以后看到控制台打印:

执行$timeout回调
angular

如果我打开注释,执行.cancel()方法,那么$timeout的回调就不会被执行,它返回的promise被reject,控制台打印:

canceled

下面做个很实用的小demo: 延迟下拉菜单: 鼠标放到button上的时候,延迟500毫秒显示下拉菜单,当鼠标离开button的时候,延迟500毫秒隐藏下拉菜单,如果鼠标是进入了下拉菜单部分,那么就不隐藏下拉菜单.如果鼠标离开了下拉菜单,延迟500毫秒隐藏下拉菜单,如果鼠标是进入了button,那么还是不隐藏下拉菜单

html:

<!DOCTYPE html>
<html ng-app="timeoutApp">
<head>
  <title>$timeout服务</title>
  <meta charset="utf-8">
  <link rel="stylesheet" href="../bootstrap.css" rel="external nofollow" />
  <script src="../angular.js"></script>
  <script src="script.js"></script>
  <style type="text/css">
  * {
   font-family:'MICROSOFT YAHEI'
  }
  </style>
</head>
<body >

 <div ng-controller="myCtrl">
   <div class="dropdown" dropdown >
     <button class="btn btn-default dropdown-toggle" type="button" ng-mouseenter = "showMenu()" ng-mouseleave = "hideMenu()">
       Dropdown
       <span class="caret"></span>
     </button>
     <ul class="dropdown-menu" ng-show="ifShowMenu" ng-mouseenter = "showMenu()" ng-mouseleave = "hideMenu()">
       <li><a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >Action</a></li>
       <li><a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >Another action</a></li>
       <li><a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >Something else here</a></li>
       <li><a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >Separated link</a></li>
     </ul>
   </div>
 </div>

</body>
</html>

js: 

var timeoutApp = angular.module('timeoutApp',[]);
timeoutApp.controller('myCtrl',function($scope){
  $scope.ifShowMenu = false;
});
timeoutApp.directive('dropdown',function($timeout){
  return {
    restrict:"EA",
    link:function(scope,iele,iattr){
      scope.showMenu = function(){
        $timeout.cancel(scope.t2);
        scope.t1 = $timeout(function(){
          scope.ifShowMenu = true
        },500)
      };
      scope.hideMenu = function(){
        $timeout.cancel(scope.t1);
        scope.t2 = $timeout(function(){
          scope.ifShowMenu = false
        },500)
      };
    }
  }
})

代码应该很好理解: 就是进入button和进入ul下拉菜单的时候,都定义一个timeout回调(过500毫秒以后显示下拉菜单),同时取消隐藏下拉菜单的回调.而离开button和ul的时候相反.

代码地址: https://github.com/OOP-Code-Bunny/angular/tree/master/%24timeout

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
ext jquery 简单比较
Apr 07 Javascript
jQuery 定时局部刷新(setInterval)
Nov 19 Javascript
JavaScript全局函数使用简单说明
Mar 11 Javascript
基于jquery的固定表头和列头的代码
May 03 Javascript
多种方法实现load加载完成后把图片一次性显示出来
Feb 19 Javascript
jquery实现浮动在网页右下角的彩票开奖公告窗口代码
Sep 04 Javascript
Bootstrap进度条组件知识详解
May 01 Javascript
深入理解jQuery.data() 的实现方式
Nov 30 Javascript
js实现HTML中Select二级联动的实例
Jan 05 Javascript
关于React动态加载路由处理的相关问题
Jan 07 Javascript
原生JS与JQ获取元素的区别详解
Feb 13 Javascript
Vue记住滚动条和实现下拉加载的完美方法
Jul 31 Javascript
JS实现json的序列化和反序列化功能示例
Jun 13 #Javascript
angularjs实现搜索的关键字在正文中高亮出来
Jun 13 #Javascript
angular-ngSanitize模块-$sanitize服务详解
Jun 13 #Javascript
让微信小程序支持ES6中Promise特性的方法详解
Jun 13 #Javascript
jQueryeasyui 中如何使用datetimebox 取两个日期间相隔的天数
Jun 13 #jQuery
Javascript实现的StopWatch功能示例
Jun 13 #Javascript
原生JS实现图片懒加载(lazyload)实例
Jun 13 #Javascript
You might like
全国FM电台频率大全 - 7 吉林省
2020/03/11 无线电
解析php mysql 事务处理回滚操作(附实例)
2013/08/05 PHP
PHP中使用Imagick读取pdf并生成png缩略图实例
2015/01/21 PHP
php中define用法实例
2015/07/30 PHP
PHP文件下载实例代码浅析
2016/08/17 PHP
PHP fopen函数用法实例讲解
2019/02/15 PHP
PHP通过GD库实现验证码功能示例
2019/02/23 PHP
php的单例模式及应用场景详解
2021/02/27 PHP
基于Web标准的UI组件 — 树状菜单(2)
2006/09/18 Javascript
用javascript实现页面打印的三种方法
2007/03/05 Javascript
jQuery实现可收缩展开的级联菜单实例代码
2013/11/27 Javascript
JS实现带鼠标效果的头像及文章列表代码
2015/09/27 Javascript
node.js基于mongodb的搜索分页示例
2017/01/22 Javascript
javascript 网页进度条简单实例
2017/02/22 Javascript
深入浅析JavaScript中的RegExp对象
2017/09/18 Javascript
详解如何实现一个简单的 vuex
2018/02/10 Javascript
vuex提交state&amp;&amp;实时监听state数据的改变方法
2018/09/16 Javascript
Vue框架里使用Swiper的方法示例
2018/09/20 Javascript
一个基于flask的web应用诞生 使用模板引擎和表单插件(2)
2017/04/11 Python
Python利用ORM控制MongoDB(MongoEngine)的步骤全纪录
2018/09/13 Python
Python3日期与时间戳转换的几种方法详解
2019/06/04 Python
python列表,字典,元组简单用法示例
2019/07/11 Python
Django的性能优化实现解析
2019/07/30 Python
Python搭建Keras CNN模型破解网站验证码的实现
2020/04/07 Python
Python‘==‘ 及 ‘is‘相关原理解析
2020/09/05 Python
JBL澳大利亚官方商店:扬声器、耳机和音响系统
2018/05/24 全球购物
墨尔本最受欢迎的复古风格品牌:Princess Highway
2018/12/21 全球购物
荷兰游戏商店:Allyouplay
2019/03/16 全球购物
GafasWorld西班牙:购买太阳镜、眼镜和隐形眼镜
2019/09/08 全球购物
工厂厂长的职责
2013/12/12 职场文书
2014学年自我鉴定
2014/02/23 职场文书
学习计划书怎么写
2014/09/15 职场文书
2015年世界环境日活动方案
2015/05/05 职场文书
毕业设计致谢词
2015/05/14 职场文书
工作汇报材料难写?方法都在这里了!
2019/07/01 职场文书
Redis如何使用乐观锁(CAS)保证数据一致性
2022/03/25 Redis