现在呼叫功能,全程每分钟1分钟?

时间:2017-08-09 09:01:55

标签: javascript angular typescript ionic-framework

使用计时器我能够每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 });

5 个答案:

答案 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);