首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >$timeout的角2等效

$timeout的角2等效
EN

Stack Overflow用户
提问于 2017-08-16 13:12:52
回答 1查看 42.7K关注 0票数 32

我必须在角2环境中使用(大量)现有代码。该代码广泛使用了来自服务 1.x的AngularJS。与代码中使用的各种其他AngularJS 1.x服务相反,我很难找到与$timeout服务的角2等价的信息。

角文档似乎没有在其名称中提到带有timeout-something的服务。https://angular.io/guide/upgrade的文章确实提到了我所面临的场景:

也许您希望访问AngularJS的内置服务,如$location$timeout

不幸的是,本文实际上并没有解释如何访问这些特定的服务,因为后面的示例HeroesService假设服务没有AngularJS 1.x提供的任何依赖项。

这一个这样的文章表明,使用本机函数也不能满足$timeout服务的功能。

如何在$timeout 2环境中复制功能?

编辑:正如在答案中所指出的,本机setTimeout函数的缺点在使用角2时不相关。在这种情况下,如果我有来自AngularJS 1.x的完整$q,我可以大致地复制$timeout函数如下:

代码语言:javascript
复制
function $timeout(fn, delay) {
    var result = $q.defer();
    setTimeout(function () {
        $q.when(fn()).then(function (v) {
            result.resolve(v);
        });
    }, delay);
    return result.promise;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-16 13:48:33

使用setTimeout本机函数。没有必要再使用特殊的服务在角。这是由于引入了区带,特别是NgZone

像本文这样的文章表明,使用本机setTimeout函数也不能满足$timeout服务的功能。

为什么让你这么说?$timeout服务的主要任务是在延迟函数执行后启动摘要。你可以从消息来源看到:

代码语言:javascript
复制
function $TimeoutProvider() {
  this.$get = ['$rootScope', '$browser', '$q', '$$q', '$exceptionHandler',
    function($rootScope,   $browser,   $q,   $$q,   $exceptionHandler) {

        timeoutId = $browser.defer(function() {
          try {
            deferred.resolve(fn.apply(null, args));
          } catch (e) {
          ...

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

在角zone.js中,拦截所有异步操作并在角中启动变化检测,即摘要的增强型

如果需要复制$timeout,大致可以这样做:

代码语言:javascript
复制
function $timeout(fn, delay, ...args) {
  let timeoutId;

  $timeout.cancel = $timeout.cancel || function (promise) {
    if (promise && promise.$$timeoutId in $timeout.promises) {
      $timeout.promises[promise.$$timeoutId][1]('canceled');
      delete $timeout.promises[promise.$$timeoutId];
      return clearTimeout(promise.$$timeoutId);
    }
    return false;
  };

  $timeout.promises = $timeout.promises || {};

  const promise = new Promise((resolve, reject) => {
    timeoutId = setTimeout(function () {
      try {
        resolve(fn.apply(null, args));
      } catch (e) {
        reject(e);
      } finally {
        delete $timeout.promises[promise.$$timeoutId];
      }
    }, delay);

    $timeout.promises[timeoutId] = [resolve, reject];
  });

  promise.$$timeoutId = timeoutId;

  return promise;
}

// some basic testing

$timeout((v) => {
  console.log('a', v);
}, 2000, 7);

const promise = $timeout(() => {
  console.log('b');
}, 3000);

promise.catch((reason) => {
  console.log(reason);
});

$timeout.cancel(promise);
票数 20
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45714574

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档