javascript - 在这个用例中 $interval 和 $timeout 之间有真正的区别吗?

标签 javascript angularjs

两者之间有真正的区别吗:

$interval(function () {
  doSomething();
}, 250, 1, true);

$timeout(function () {
  doSomething();
}, 250);
  • 两项返回 promise
  • 两者都执行 doSomething() 一次。
  • 两者都会触发消化周期。

我注意到的唯一可能的区别是,如果我使用 false 作为 $interval 的最后一个参数,我可以绕过摘要循环。

最佳答案

让我们进行一些代码分析

超时

function timeout(fn, delay, invokeApply) {
  var deferred = $q.defer(),
      promise = deferred.promise,
      skipApply = (isDefined(invokeApply) && !invokeApply),
      timeoutId;

  timeoutId = $browser.defer(function() {
    try {
      deferred.resolve(fn());
    } catch(e) {
      deferred.reject(e);
      $exceptionHandler(e);
    }
    finally {
      delete deferreds[promise.$$timeoutId];
    }

    if (!skipApply) $rootScope.$apply();
  }, delay);

  promise.$$timeoutId = timeoutId;
  deferreds[timeoutId] = deferred;

  return promise;
}

间隔

function interval(fn, delay, count, invokeApply) {
  var setInterval = $window.setInterval,
      clearInterval = $window.clearInterval,
      deferred = $q.defer(),
      promise = deferred.promise,
      iteration = 0,
      skipApply = (isDefined(invokeApply) && !invokeApply);

  count = isDefined(count) ? count : 0;

  promise.then(null, null, fn);

  promise.$$intervalId = setInterval(function tick() {
    deferred.notify(iteration++);

    if (count > 0 && iteration >= count) {
      deferred.resolve(iteration);
      clearInterval(promise.$$intervalId);
      delete intervals[promise.$$intervalId];
    }

    if (!skipApply) $rootScope.$apply();

  }, delay);

  intervals[promise.$$intervalId] = deferred;

  return promise;
}

最后一个区别并不正确,因为这两种方法都实现了 if (!skipApply) $rootScope.$apply(); 没有区别

关于javascript - 在这个用例中 $interval 和 $timeout 之间有真正的区别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25231513/

相关文章:

javascript - 停止YouTube API自动播放

javascript - AngularJS - 等待服务器的响应

angularjs - Angular UI Router - 具有多种布局的嵌套状态

java - JAX-RS 和 AngularJS 之间的请求和响应

javascript - angularjs:嵌套的ng-repeat在选择中创建空白值

javascript - 将单选按钮值绑定(bind)到 Controller (使用 angularjs 1.5)

javascript - 根据变量值在javascript中获取图像

javascript - .on ('show.bs.modal' , function() 在 safari 和 firefox 中不起作用

javascript - 使用 on() 方法获取当前对象

javascript - 某些元素未从数组中删除