`
leeqq
  • 浏览: 138598 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

angular的$timeout和window.setTimeout的区别

阅读更多

这个问题也是前段时间面试的时候面试官问的,当时也只是略知一二,后来回来后查看的源码,才搞清楚

总结起来有以下几点:

1. 在$timeout中传入的函数会被包含在try...catch中,并且在异常时将异常交给$exceptionHandler

2. window.setTimeout返回的是数字id,可以通过window.clearTimeout(id)取消,而$timeout返回的是promise对象,要取消要用$timeout.cancel(返回的promise对象)

3. $timeout传入的function会更新作用域内的数据绑定,也就是说在function中对$scope的修改会触发更新,而window.setTimeout中对$scope的修改不会触发更新。当然$timeout有第三个参数,默认为true,如果传入false,则不会更新当前作用域的数据绑定

 

当然$timeout的实现仍然是调用原生的window.setTimeout。那么是怎么实现的呢。看看源码就知道了。

function timeout(fn, delay, invokeApply) {
  var skipApply = (isDefined(invokeApply) && !invokeApply),
      deferred = (skipApply ? $$q : $q).defer(),
      //要返回的prosemise对象
      promise = deferred.promise,
      timeoutId;

  timeoutId = $browser.defer(function() {
    try {
      //这里调用了fn(),并且把返回值作为resolve的参数,如果对$timeout返回的promise对象调用的then方法,这里fn的返回值就可以用到了
      deferred.resolve(fn());
    } catch(e) {
      deferred.reject(e);
      $exceptionHandler(e);
    }
    finally {
      delete deferreds[promise.$$timeoutId];
    }
    //通过第三个参数来确定是否要执行$apply触发更新
    if (!skipApply) $rootScope.$apply();
  }, delay);
  //在timeoutId挂在promise对象上
  promise.$$timeoutId = timeoutId;
  deferreds[timeoutId] = deferred;
  //返回的promise对象
  return promise;
}

 $browser.defer方法如下

self.defer = function(fn, delay) {
    var timeoutId;
    outstandingRequestCount++;
    //此处调用了原生的setTimeout并返回数字id
    timeoutId = setTimeout(function() {
        delete pendingDeferIds[timeoutId];
        completeOutstandingRequest(fn);
    }, delay || 0);
    pendingDeferIds[timeoutId] = true;
    return timeoutId;
};

 在实际应用时如下

 

var returnedPromise = $timeout(function(){return 'value';}, 2000);

这里可以对returnedPromise调用then方法或者finally等方法

returnedPromise.then(resolveFun, rejectFun, progressFun)

这时到时间后resolveFun这些方法也要执行

分享到:
评论

相关推荐

    loopback-sdk-angular, 自动生成用于环回的Angular $resource 服务的服务.zip

    loopback-sdk-angular, 自动生成用于环回的Angular $resource 服务的服务 环回 AngularJS SDK注意:模块取代了环回角 。 请相应更新你的package.json 。 web AngularJS提供了一个基于 ngResource的API,它支持你的...

    angularjs之$timeout指令详解

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

    AngularJs定时器$interval 和 $timeout详解

    最后,虽然$interval和$timeout服务的使用与JavaScript原生的setInterval和setTimeout非常相似,但它们具有AngularJS的特殊处理,比如在AngularJS的脏值检查机制内,以及它们返回promise对象的特性,这使得它们更加...

    angular.min .v1.2.11.js

    google网站无法下载angular.min .v1.2.11.js

    Rails.Angular.Postgres.and.Bootstrap.2nd.Edition

    Embrace the full stack of web development, from styling with Bootstrap, building an interactive user interface with Angular 2, to storing data quickly and reliably in PostgreSQL. With this fully ...

    sample-angular-node, 使用 angular.js 和 node.js的示例应用程序呈现 tweet.zip

    sample-angular-node, 使用 angular.js 和 node.js的示例应用程序呈现 tweet 使用 Angular & node 呈现 tweet使用 angular.js 。node.js 和 Twitter API的示例应用程序。安装和运行安装 node.js 。克隆 GitHub repo:...

    高效利用Angular中内置服务$http、$location等_.docx

    这两个服务类似于JavaScript的 `setTimeout()` 和 `setInterval()`,但它们都是异步的,并且遵循Angular的依赖注入规则。`$timeout` 用于延迟执行函数,而 `$interval` 用于周期性执行。与原生JavaScript不同的是,...

    Angular-angular2-mdl.zip

    Angular-angular2-mdl.zip,基于Material Design Lite的Angular 2、4、5、6、7、8组件、指令和样式(NPM:@Angular MDL/Core)基于Material Design Lite的Angular 8组件、指令和样式https://getmdl.io(v:1.3.0)。...

    Angular项目中$scope.$apply()方法的使用详解

    主要给大家介绍了关于Angular项目中$scope.$apply()方法使用的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Angularjs具有一定的参考学习价值,需要的朋友们下面跟着小编一起来看看吧。

    angular.js后台管理系统.zip

    - **性能优化**:使用$timeout代替setTimeout,减少$digest循环次数,使用$resource替代$http提高数据请求效率。 - **安全考虑**:处理XSS和CSRF攻击,对用户输入进行校验。 5. **社区支持和生态系统** Angular....

    angular-ja, 日本 angular.io 本地化库.zip

    angular-ja, 日本 angular.io 本地化库 角 lacolacostudioTeaTwoarayaryomachloe463Pittankappy MasanobuAkibamitsu

    angular-resize:Angular.JS 的 Window.resize 钩子

    使用 Angular.JS 连接window.resize 。 用法 将 angular-resize 添加到您的项目中: bower install --save angular-resize 将其添加到您的 HTML 文件中: < script src =" bower_components/angular-resize/...

    AngularJS中$watch和$timeout的使用示例

    $timeout是AngularJS提供的一个包装了JavaScript原生setTimeout函数的服务,它用于在指定的延迟后执行函数。当结合$watch使用时,可以在回调函数中设置一个$timeout,用于延时执行某些任务。例如,在用户完成一定...

    Angular-angular-modal-service.zip

    Angular-angular-modal-service.zip,AngularJS的模态服务-支持通过服务创建弹出窗口和模态。Angular-modal-service,Angularjs于2016年发布,是Angularjs的重写版。它专注于良好的移动开发、模块化和改进的依赖注入。...

    angular-route.min.js

    angular-route.min.js前端MVC框架AngularJS路由视图所需资源Angular-route.js

    Angular-angular2-cookie.zip

    Angular-angular2-cookie.zip,Angular1.x$cookies服务到Angular2 cookie的实现已弃用=>NGX cookie,Angularjs于2016年发布,是Angularjs的重写版。它专注于良好的移动开发、模块化和改进的依赖注入。angular的设计...

    Angular-angular2-contextmenu.zip

    Angular-angular2-contextmenu.zip,-不推荐使用ngx context menu-一个由ui.bootstrap.contextmenu.deprecated启发的angular 2构建的上下文菜单。不推荐使用ngx contextmenu,Angularjs于2016年发布,是Angularjs的...

    Angular-angular2-tinymce.zip

    Angular-angular2-tinymce.zip,Tinymce MCE WYSIWYG Editorangular2 Tinymce的角2组件,Angularjs于2016年发布,是Angularjs的重写版。它专注于良好的移动开发、模块化和改进的依赖注入。angular的设计目的是全面解决...

Global site tag (gtag.js) - Google Analytics