【问题标题】:In JavaScript, how can I run a function only ONCE in a for loop?在 JavaScript 中,如何在 for 循环中只运行一次函数?
【发布时间】:2018-05-16 12:50:50
【问题描述】:

我已经阅读了很多人的类似问题,但没有找到答案。所以我在问我自己的问题。

我一直在构建一项功能,允许我的用户播放他们正在查看的页面上的所有音轨。但是,为了让我的音频播放器最初出现在页面上,当用户单击“全部播放”按钮时,我必须至少 initPlayer() 一次。

问题是,我正在使用 for 循环遍历数组中的所有歌曲 ID,以用歌曲填充播放列表。

var theids = ids.split(",");

for (var i = 0; i < theids.length; i++) {
  getItem(theids[i], type).done(function(obj) {
    if (obj.status == 'success') {
      mep.mepPlaylistTracks = obj.tracks;
      initPlayer();
      addToPlay(obj.tracks, play);
    }
  });
}

initPlayer() 依靠来自我的getItem() 函数的信息来正确启动第一次。所以必须按这个顺序放置。

有没有办法在我的for 循环中只触发一次我的initPlayer() 函数?每次将歌曲添加到播放列表时,它都会导致我的播放器重新启动,从而导致性能和视觉问题。

这种事情在 Javascript 中是可能的吗?


编辑以添加initPlayer()getItem() 函数。我是Javascript 的新手,感谢您的帮助。

// init player
  function initPlayer(){
    $('.app-player').removeClass('hide');
    $('#app').removeClass('hide-player');

    var playlist = $( '.playlist' ).mepPlaylist({
      audioHeight: '40',
      audioWidth: '100%',
      videoHeight: '40',
      videoWidth: '100%',
      audioVolume: 'vertical',
      mepPlaylistLoop: true,
      alwaysShowControls: true,
      mepSkin: 'mejs-audio',
      mepResponsiveProgress: true,
      mepAutoPlay: false,
      mepSelectors: {
        playlist: '.playlist',
        track: '.track',
        tracklist: '.tracks'
      },
      features: [
        //'meplike',
        'mepartwork',
        'mepcurrentdetails',
        'mepplaylist',
        'mephistory',
        'mepprevioustrack',
        'playpause',
        'mepnexttrack',
        'progress',
        'current',
        'duration',
        'volume',
        'mepicons',
        'meprepeat',
        'mepshuffle',
        'mepsource',
        'mepbuffering',
        'meptracklist',
        'mepplaylisttoggle',
        'youtube'
      ],
      mepPlaylistTracks: mep.mepPlaylistTracks
    });

function getItem(id, type){
    return $.ajax({
       type : "post",
       dataType : "json",
       url : ajax.ajax_url,
       data : {action: "ajax_music", id: id, type: type, nonce: ajax.nonce}
    });
  }

【问题讨论】:

  • 一个“循环”和“一次”没有意义......不要使用循环,那么你将运行一次代码......
  • “医生,我这样做会很痛!” ...好吧,那就不要这样做了。
  • 你不能在页面加载时运行一次initPlayer 吗?
  • 您的前提是“必须按此顺序放置”不一定正确。您还没有向我们展示 initPlayer 中的内容或 getItem 中的内容,那么我们如何才能帮助您?
  • 我认为您正在寻找的真正解决方案是:Wait until all jQuery Ajax requests are done

标签: javascript function for-loop


【解决方案1】:

您可以像这样在 for 循环之外定义一个布尔值:

var theids = ids.split(",");
var once = false;

for (var i = 0; i < theids.length; i++) {
  getItem(theids[i], type).done(function(obj) {
    if (obj.status == 'success') {
      mep.mepPlaylistTracks = obj.tracks;

      if(!once) {
          initPlayer();
          once = true;
      }

      addToPlay(obj.tracks, play);
    }
  });
}

【讨论】:

  • 不知道为什么这会受到如此严重的反对,因为这可以满足 OP 的要求,但几乎可以肯定有更好的方法来解决这个问题。
  • 有趣,谢谢。我也许可以在我的脚本中使用它。
  • @JJJ 我好像问了一个非常不受欢迎的问题。所以这可能就是为什么一切都被否决了。但我感谢您的帮助。
  • @anthonyCam 虽然这可行,但我仍然建议重写您的代码以不需要这样的东西(JJJ 在评论中发布的链接是一个不错的选择)
  • @JJJ 你是对的。我正在学习 Javascript,当它们可能不是正确的解决方案时,我倾向于接受简单的解决方案。不过,它可以帮助我思考……谢谢
猜你喜欢
  • 2022-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多