Javascript 正在等待对象构造函数中的方法完成,然后继续

Javascript 正在等待对象构造函数中的方法完成,然后继续,javascript,asynchronous,Javascript,Asynchronous,我正在建立一个计时器,从25分钟计数到0,然后从5分钟计数到0一定次数。现在,我有一个倒计时对象,参数为25*60,从25计数到0。我想启动一个新的计时器,当另一个计时器达到0时,它将从5计数到0。如何实现这种类型的异步代码,然后执行该异步代码X次 $(document).ready(function(){ var sessionBreakTimer = new CountDownTimer(25*60); sessionTimer.start(); if (!sessionTime

我正在建立一个计时器,从25分钟计数到0,然后从5分钟计数到0一定次数。现在,我有一个倒计时对象,参数为25*60,从25计数到0。我想启动一个新的计时器,当另一个计时器达到0时,它将从5计数到0。如何实现这种类型的异步代码,然后执行该异步代码X次

$(document).ready(function(){
  var sessionBreakTimer = new CountDownTimer(25*60);
  sessionTimer.start();
  if (!sessionTimer.isRunning) {
    sessionBreakTimer.start();
  }
);

function CountDownTimer(secs) {
  var duration = secs;
  var running = false;

  this.start = function() {
    running = true;
    var startT = new Date().getTime();
    var intervalId = window.setInterval(function() {
      var msDelta = new Date().getTime() - startT; // milliseconds elapsed since start
      var secsLeft = duration - Math.floor(msDelta / 1000);
      if (secsLeft === 0) {
        window.clearInterval(intervalId);
        console.log("cleared");
        running = false;
      }
    }, 1000); //update about every second
  };

  this.isRunning = function() {
    return running;
  }

}

您可以将
回调
方法添加到
倒计时
中,并将其设置为在达到0秒时调用适当的计时器。例如:

function CountDownTimer(secs) {
  var self = this;
  var duration = secs;
  var running = false;

  this.callback = function(){}; //This will allow you to define this afterwards

  this.start = function() {
    running = true;
    var startT = new Date().getTime();
    var intervalId = window.setInterval(function() {
      var msDelta = new Date().getTime() - startT; // milliseconds elapsed since start
      var secsLeft = duration - Math.floor(msDelta / 1000);
      if (secsLeft === 0) {
        window.clearInterval(intervalId);
        console.log("cleared", secs);
        running = false;
        self.callback();//your callback is being called here
      }
    }, 1000); //update about every second
  };

  this.isRunning = function() {
    return running;
  }

}
你这样定义它:

$(document).ready(function(){
  var sessionBreakTimer = new CountDownTimer(25*60);
  var sessionTimer = new CountDownTimer(5*60);
  sessionBreakTimer.callback = sessionTimer.start;//sessionTimer will be called when breaktimer is over
  sessionTimer.callback = sessionBreakTimer.start;//and vice versa
  sessionTimer.start();

});

如果希望只执行特定的次数,则每次调用计时器时都需要一个变量来计数,并且在调用结束后,根据需要将回调设置为具有finish行为的函数或仅为空函数。

尝试使用

var有效期内,
//当前计数
计数=0,
//电流停止
停止=2,
//会议周期`
刻度=0,
//要调用的“会话”周期
总计=2,
计数器=功能计数器(会话){
var fn=函数fn(){
//调用'CountDownTimer.start()`
返回新的倒计时(会话[计数]).start()
.then(功能(数据){
控制台日志(数据);
//递归调用计数器`
返回计数器(会话)
})
}
返回计数<停止?fn():(函数(){
//增量`滴答声`
++蜱虫;
//将“计数”重置为“0”`
计数=0;
返回刻度<总刻度
?fn()
//当`滴答声'等于`总数时做某事`
:承诺({
伯爵:伯爵,
滴答声:滴答声,
总计:总计
})
}())
}
功能倒计时(秒){
var持续时间=秒;
var running=false;
倒计时=这个;
this.start=函数(){
//从'CountDownTimer.start'返回'Promise'对象`
返回新承诺(函数(解析){
运行=真;
var startT=new Date().getTime();
intervalId=window.setInterval(函数(){
//启动后已过毫秒
var msDelta=new Date().getTime()-startT;
var secsLeft=持续时间-数学下限(msDelta/1000);
控制台日志(secsLeft);
如果(secsLeft==0){
窗口。clearInterval(intervalId);
//递增计数`
++计数;
控制台日志(“清除”);
运行=错误;
决心({
伯爵:伯爵,
滴答声:滴答声,
总计:总计
})
}
},1000);//大约每秒更新一次
})
};
this.isRunning=函数(){
返回运行;
};
}
//会话的设置`
//设置为60秒,stacksnippets设置为30秒
var会话=[1*60,0.5*60];
//var会话=[25*60,5*60];
柜台(会议)
//当“滴答声”的所有周期都完成时做一些事情
.then(功能(数据){
日志(“完成:”,数据)

});为什么我们不需要下面代码中的关键字
new
当滴答声等于total:Promise.resolve({count:count,滴答声:滴答声,total:total})时执行任务@See