ember.js 什么是setInterval和clearInterval的Ember实现

rvpgvaaj  于 2022-11-05  发布在  其他
关注(0)|答案(4)|浏览(240)

Ember有以下setTimeout的实现,建议开发人员使用,因为代码被添加到run循环中,这对测试有好处。

Ember.run.later((function() {
               console.log("will run once after 1000");
           }), 1000);

是否有类似的Ember替换setInterval,以及隐含的clearInterval(用于取消setInterval)?我需要每1000毫秒运行一次someFunc

this.intervalId = setInterval(this.someFunc.bind(this), 1000);
c86crjj0

c86crjj01#

我不知道有什么等效的代码,但我使用这样的代码来实现以下功能:

var Poller = Ember.Object.extend({

  _interval: 1000,
  _currentlyExecutedFunction: null,

  start: function(context, pollingFunction) {
    this.set('_currentlyExecutedFunction', this._schedule(context, pollingFunction, [].slice.call(arguments, 2)));
  },

  stop: function() {
    Ember.run.cancel(this.get('_currentlyExecutedFunction'));
  },

  _schedule: function(context, func, args) {
    return Ember.run.later(this, function() {
      this.set('_currentlyExecutedFunction', this._schedule(context, func, args));
      func.apply(context, args);
    }, this.get('_interval'));
  },

  setInterval: function(interval) {
    this.set('_interval', interval);
  }

});

export
default Poller;

然后,示例化轮询器:var poller = Poller.create(),然后你可以玩poller.start()poller.stop() + set通过poller.setInterval(interval)设置间隔。
在我的代码中,我或多或少是这样做的(每10秒轮询一次报告):

_updateRunningReport: function(report) {
  var poller = new Poller();
  poller.setInterval(this.POLLING_INTERVAL);
  poller.start(this, function() {
    if (report.isRunning()) {
      this._reloadReport(report);
    } else {
      poller.stop();
    }
  });
  eventBus.onLogout(function() {
    poller.stop();
  });
},

希望这对你有帮助...

wkftcu5l

wkftcu5l2#

我一直在玩实现“setInterval”在ember辛烷的方式,我认为这是最简单和干净的解决方案:
index.hbs:

{{this.counter}}
<button {{on "click" this.start}}>Start</button>
<button {{on "click" this.stop}}>Stop</button>
<button {{on "click" this.reset}}>Reset</button>

controllers/index.js

import Controller from '@ember/controller';
import { tracked } from '@glimmer/tracking';
import { action } from '@ember/object';
import { cancel, later, next } from '@ember/runloop';

export default class IndexController extends Controller {
  @tracked counter = 0;
  runner = null;

  @action start() {
    next(this, function () {
      this.runner = this.tick();
    });
  }

  @action stop() {
    cancel(this.runner);
  }

  @action reset() {
    this.counter = 0;
  }

  tick() {
    return later(this, function () {
      this.counter++;
      this.runner = this.tick();
    }, 1000);
  }    
}

63lcw9qa

63lcw9qa3#

另一种选择是使用ember-poll插件。在内部,它的作用与@andrusieczko Poller对象相同(两者都考虑到Ember Run Loop)。从Ember开发者的Angular ,您可以访问poll服务。
只需安装加载项:npm install ember-poll --save-dev .
示例:

import Ember from 'ember';

export default Ember.Route.extend({
  poll: Ember.service.inject(),

  setupController() {
    this._super(...arguments);

    this.get('poll').addPoll({
      interval: 1000,
      label: 'my-poll',
      callback: () => {
        //do something every second
      }
    }); 
  },

  actions: {
    willTransition() {
      this.get('poll').clearPollByLabel('my-poll');
    }
  }
}
kuhbmx9i

kuhbmx9i4#

ember -v 1.18中测试
这就是我在组件中所做的。这工作得非常好,应该是理想的方法。如果你在区间内处理异步承诺对象,确保在willDestroyElement()钩子或其他地方杀死它。

init() {
  this._super(...arguments);
  this.startAutoSaveTimer();
},

startAutoSaveTimer() {
  let autosaveFunc = function() {
    console.info('Arr .. I'm a pirate!');
  };
  set(this, 'timerInstance', setInterval(autosaveFunc, 1000));
},

相关问题