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 相关文章推荐
如何取得中文输入的真实长度?
Jun 24 Javascript
jquery结婚电子请柬特效源码分享
Aug 21 Javascript
angular.js之路由的选择方法
Sep 24 Javascript
AngularJS变量及过滤器Filter用法分析
Nov 22 Javascript
vue中使用localstorage来存储页面信息
Nov 04 Javascript
在knockoutjs 上自己实现的flux(实例讲解)
Dec 18 Javascript
JavaScript多线程运行库Nexus.js详解
Dec 22 Javascript
解决vue中post方式提交数据后台无法接收的问题
Aug 11 Javascript
Vue动态组件和异步组件原理详解
May 06 Javascript
jquery弹窗时禁止body滚动条滚动的例子
Sep 21 jQuery
js实现点赞按钮功能的实例代码
Mar 06 Javascript
解决vue项目运行npm run serve报错的问题
Oct 26 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
PHP的几个常用加密函数
2016/02/03 PHP
基于jQuery的弹出警告对话框美化插件(警告,确认和提示)
2010/06/10 Javascript
JavaScript Memoization 让函数也有记忆功能
2011/10/27 Javascript
JavaScript字符串插入、删除、替换函数使用示例
2013/07/25 Javascript
Json实现异步请求提交评论无需跳转其他页面
2014/10/11 Javascript
javascript的列表切换【实现代码】
2016/05/03 Javascript
浅谈JSON.stringify()和JOSN.parse()方法的不同
2016/08/29 Javascript
AngularJS变量及过滤器Filter用法分析
2016/11/22 Javascript
详解javascript立即执行函数表达式IIFE
2017/02/13 Javascript
jQuery实现的背景颜色渐变动画效果示例
2017/03/24 jQuery
vue实现仿淘宝结账页面实例代码
2017/11/08 Javascript
vue: WebStorm设置快速编译运行的方法
2018/10/18 Javascript
详解vuex持久化插件解决浏览器刷新数据消失问题
2019/04/15 Javascript
ES6基础之字符串和函数的拓展详解
2019/08/22 Javascript
vue 点击其他区域关闭自定义div操作
2020/07/17 Javascript
nuxt 自定义 auth 中间件实现令牌的持久化操作
2020/11/05 Javascript
django 自定义用户user模型的三种方法
2014/11/18 Python
简单介绍Python中的几种数据类型
2016/01/02 Python
Django1.7+python 2.78+pycharm配置mysql数据库
2016/10/09 Python
Python中struct模块对字节流/二进制流的操作教程
2017/01/21 Python
Odoo中如何生成唯一不重复的序列号详解
2018/02/10 Python
详解Python中如何写控制台进度条的整理
2018/03/07 Python
无法使用pip命令安装python第三方库的原因及解决方法
2018/06/12 Python
PyCharm+PySpark远程调试的环境配置的方法
2018/11/29 Python
python五子棋游戏的设计与实现
2019/06/18 Python
Python列表删除元素del、pop()和remove()的区别小结
2019/09/11 Python
python3中的eval和exec的区别与联系
2019/10/10 Python
医学类导师推荐信范文
2013/11/19 职场文书
捐书寄语赠言
2014/01/18 职场文书
新闻学专业个人求职信写作
2014/02/04 职场文书
拉拉队口号
2014/06/16 职场文书
社区清明节活动总结
2014/07/04 职场文书
国际商务专业毕业生自我鉴定2014
2014/09/27 职场文书
用Python制作灯光秀短视频的思路详解
2021/04/13 Python
MySQL 存储过程的优缺点分析
2021/05/20 MySQL
Win11电脑显示本地时间与服务器时间不一致怎么解决?
2022/04/05 数码科技