【问题标题】:How to fill an array of promises faster如何更快地完成一系列承诺
【发布时间】:2023-04-10 20:08:01
【问题描述】:

这是我需要做的, 我需要按顺序排列整个 youtube 播放列表,所以我需要做这样的事情

const track_names = await sp.get_playlist_track_names(link);

for (let i = 0; i < track_names.length; i++){
  queue[last_index] = await yt.get_video(track_names[i]);
}

所以你可以想象这太慢了,因为如果我尝试将 100 首歌曲的播放列表排入队列,直到我获得所有歌曲信息后它才会开始播放。

有更快的方法吗?或者播放第一首歌,让程序执行函数play_song(),而我的函数get_tracks_info()获取剩余的歌曲。

【问题讨论】:

  • 投票重新开放,因为 OP 不想等待所有承诺解决,他们特别想在第一个承诺解决后立即做某事
  • 使用observer api观察变量变化,不要等待任何promise。
  • 在循环中添加if (i == 0) play_song()
  • 如何使用Promise.race 等待任何歌曲下载完成 -> 然后开始播放并下载其余歌曲?

标签: javascript node.js discord


【解决方案1】:

如果是来自我的服务器的曲目,我会使用流式传输。

const trackList = await getTheListOfYourTracks();

let curTrackIndex = -1;

发出api请求,分块获取当前曲目的数据

function playNextTrack() {
  if (curTrackIndex <= trackList.length - 1) {
    currentTrack = trackList[curTrackIndex + 1];
    // Make API call here
    // After finish, call this function again to play next track
    ++curTrackIndex;
    playNextTrack();
  } else {
  // Do whatever after tracklist ends
  }
}

playNextTrack();

然后在第一首曲目结束后立即发出另一个api请求

这样你就不必等待任何东西,它会更快

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-19
    • 2018-07-07
    • 1970-01-01
    • 1970-01-01
    • 2019-03-27
    • 2016-09-02
    • 2018-10-03
    • 1970-01-01
    相关资源
    最近更新 更多