绩效考核手机版
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

72 lines
1.6 KiB

import createTimer from './createTimer';
function isSameSecond(time1, time2) {
return Math.floor(time1 / 1000) === Math.floor(time2 / 1000);
}
/**
* @description: 倒计时控制器
* @param {{ time: Number, millisecond?: Boolean, onChange?: Function, onFinish?: Function }} options
* @return {{ start: Function, stop: Function, reset: Function, finish: Function }}
*/
export default function countDown(options) {
const { time, millisecond, onChange, onFinish } = Object.assign({
time: 0,
millisecond: false,
onChange: null,
onFinish: null,
}, options);
let remain = time;
let endTime = 0;
const getCurrentRemain = () => Math.max(endTime - Date.now(), 0);
const setRemain = value => {
remain = value;
onChange && onChange(remain);
if (remain === 0) {
stop();
onFinish && onFinish();
}
};
const timer = createTimer(next => {
const currentRemain = getCurrentRemain();
if (millisecond) {
setRemain(currentRemain);
} else {
if (!isSameSecond(currentRemain, remain) || currentRemain === 0) {
setRemain(currentRemain);
}
}
if (remain > 0) {
next();
}
}, 30, false);
const start = function () {
endTime = Date.now() + remain;
timer.start();
return this;
};
const stop = function () {
timer.stop();
return this;
};
const reset = function (newTime) {
timer.stop();
setRemain(typeof newTime === 'number' ? newTime : time);
return this;
};
const finish = function () {
timer.stop();
setRemain(0);
return this;
};
return { start, stop, reset, finish };
}