setInterval 和 clearInterval 的 Ember 实现是什么
what is the Ember implementation of setInterval and clearInterval
Ember 有以下 setTimeout
的实现,推荐开发者使用,因为代码被添加到 运行 循环中,这有利于测试。
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);
我不知道有任何等效项,但我使用这样的代码来实现以下功能:
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()
+ 通过 poller.setInterval(interval)
.[=16= 设置间隔]
在我的代码中,我或多或少是这样做的(每 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();
});
},
希望这对您有所帮助...
另一种选择是使用 ember-poll 附加组件。在内部,它与@andrusieczko Poller 对象有些相同(两者都考虑了 Ember 运行 循环)。从 Ember 开发人员的角度来看,您可以访问 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');
}
}
}
在 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));
},
我一直在以 Ember Octane 的方式使用工具 "setInterval",我认为这是最简单干净的解决方案:
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);
}
}
Ember 有以下 setTimeout
的实现,推荐开发者使用,因为代码被添加到 运行 循环中,这有利于测试。
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);
我不知道有任何等效项,但我使用这样的代码来实现以下功能:
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()
+ 通过 poller.setInterval(interval)
.[=16= 设置间隔]
在我的代码中,我或多或少是这样做的(每 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();
});
},
希望这对您有所帮助...
另一种选择是使用 ember-poll 附加组件。在内部,它与@andrusieczko Poller 对象有些相同(两者都考虑了 Ember 运行 循环)。从 Ember 开发人员的角度来看,您可以访问 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');
}
}
}
在 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));
},
我一直在以 Ember Octane 的方式使用工具 "setInterval",我认为这是最简单干净的解决方案:
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);
}
}