Appearance
音乐播放器
下面代码有误,请修改并完善
js
function createPlayer(totalDuration) {
let currentTimer = 0;
const listener = [];
const nextTimeout = (callback) => {
setTimeout(() => {
const ret = callback();
if (callback === false) return;
nextTimeout(callback);
}, 1000);
};
const playing = () => {
currentTimer = currentTimer + 1000;
listener.forEach((fn) => {
fn(Math.floor(currentTimer / totalDuration) * 100);
});
return currentTimer < totalDuration;
};
return {
play() {},
on(callback) {
listener.push(callback);
},
pause() {},
stop() {
currentTimer = 0;
},
};
}
// 使下面的测试代码按要求输出结果
const player = createPlayer(10 * 1000); // 播放 10s 的歌曲
let start = Date.now();
let getTimeSpan = () => Math.floor((Date.now() - start) / 1000);
player.on((progress) => {
console.log(`${getTimeSpan()}s: ${progress}%`);
});
player.play();
setTimeout(() => {
player.pause();
}, 2000);
setTimeout(() => {
player.play();
}, 4000);
setTimeout(() => {
player.stop();
}, 6000);
// output
// 开始后,输出: 0s: 0%
// 1s 后,输出: 1s: 10%
// 2s 后,输出: 2s: 20%
// 3s 后,没有任何输出
// 4s 后,输出: 4s: 20%
// 5s 后,输出: 5s: 30%
// 6s 后,输出: 6s: 0%
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
ts
function createPlayer(totalDuration: any) {
let currentTimer = 0;
const listener: any[] = [];
let timer: any = null;
const nextTimeout = (callback: any) => {
timer = setTimeout(() => {
const ret = callback();
if (ret === false) return;
nextTimeout(callback);
}, 1000);
};
const playing = () => {
listener.forEach((fn) => {
fn(Math.floor((currentTimer * 100) / totalDuration));
});
currentTimer = currentTimer + 1000;
return currentTimer < totalDuration;
};
return {
play() {
playing() && nextTimeout(playing);
},
on(callback: any) {
listener.push(callback);
},
pause() {
listener.forEach((fn) => {
fn(Math.floor((currentTimer * 100) / totalDuration));
});
clearTimeout(timer);
},
stop() {
currentTimer = 0;
this.pause();
},
};
}
// 使下面的测试代码按要求输出结果
const player = createPlayer(10 * 1000); // 播放 10s 的歌曲
let start = Date.now();
let getTimeSpan = () => Math.floor((Date.now() - start) / 1000);
player.on((progress: any) => {
console.log(`${getTimeSpan()}s: ${progress}%`);
});
player.play();
setTimeout(() => {
player.pause();
}, 2000);
setTimeout(() => {
player.play();
}, 4000);
setTimeout(() => {
player.stop();
}, 6000);
// output
// 开始后,输出: 0s: 0%
// 1s 后,输出: 1s: 10%
// 2s 后,输出: 2s: 20%
// 3s 后,没有任何输出
// 4s 后,输出: 4s: 20%
// 5s 后,输出: 5s: 30%
// 6s 后,输出: 6s: 0%
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71