Skip to content
目录

音乐播放器

下面代码有误,请修改并完善

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
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

Released under the MIT License.