使用计时器我能够每1分钟调用一次函数,但不是我想要的方式,如果现在10:35:21
函数应该像这样被调用:
at 10:35:21
at 10:36:00
at 10:37:00
at 10:38:00
at 10:39:00
at 10:40:00
etc
怎么做?这是我目前的代码:
let startTime = new Date(Math.ceil(new Date().getTime() / 60000) * 60000);
let source = Rx.Observable.timer(startTime, 60000).timeInterval().pluck('interval');
this.Subscription = source
.subscribe(data => { //code });
答案 0 :(得分:1)
您可以根据下一分钟的时间设置超时时间。
const rolled_up: Datapoint = data.reduce(function(a: Datapoint, b: Datapoint){
props.map(function(prop: string){
a[prop] += b[prop]
})
return a
})

答案 1 :(得分:0)
你可以从那样的事情开始......
Rx
.Observable
.create((observer) => {
const oneMin = 60000;
let index = 0;
const iterate = () => window.setTimeout(iteration, (
oneMin - (Date.now() % oneMin)
));
function iteration() {
observer.next(index++);
return iterate();
}
iteration();
})
;
答案 2 :(得分:0)
将订阅间隔设置为1000,并检查秒数何时更改为0.这是一个简单的解决方案,可以在原始代码中进行最少的更改,从而完全符合您的要求:
let startTime = new Date(Math.ceil(new Date().getTime() / 60000) * 60000);
let source = Observable.timer(startTime, 1000);
this.Subscription = source.subscribe(
ticks => {
if((ticks % 60) === 0) {
console.log('Current Seconds is 0');
// Perform your action here.
}
}
);
这是一个有效的插件:DEMO
答案 3 :(得分:0)
我已经改变了Faisal的解决方案,现在它可以正常运行,也可以立即启动,累积偏移量没有问题:
let startTime = new Date();
this.Source = Rx.Observable.timer(startTime, 1000).timeInterval().pluck('interval');
this.Subscription = this.Source
.subscribe(data => {
if (Math.floor(this.LastPing.getTime() / 60000) * 60000 != Math.floor(new Date().getTime() / 60000) * 60000) {
this.LastPing = new Date();
//rest of the code
}
});
答案 4 :(得分:-1)
尝试类似这样的事情,正如@Hitmands所述,你永远不会得到完全的精确度:
let date = new Date(),
remainingSeconds = 60 - date.getSeconds();
function myFunc () {
console.log(new Date());
}
myFunc();
setTimeout(() => {
myFunc();
setInterval(myFunc, 60000);
}, remainingSeconds * 1000);