2017-11-30 5 views
1

그래서 내가 사용하는 불화 봇의 경우 사용자 지정 재생 목록을 만들어 txt 파일로 저장할 수 있습니다. 텍스트 파일을 읽고 각 노래를 대기열에 넣고 싶습니다. 문제는 그것을 수행하는 비동기 함수라는 것이므로 순서를 유지하기를 원한다고해도 명령을 잃어 버릴 수 있습니다.이 문제를 해결할 방법이 있습니까? 이것은 내 코드가 어떻게 생겼는지, 그리고 첫 번째 노래부터 마지막까지 순서를 유지하기 위해 어디에서 시작해야할지 모르겠습니다. 이 같은 플레이리스트 filelooks :자바 스크립트에서 비동기 함수를 사용할 때 어떻게 파일을 순서대로 보관할 수 있습니까?

천둥

신자

시골 길로 의미

가까이 리믹스

나에게

을 의미 집에 데려다 그리고 코드는 다음과 같습니다. 어떤 도움을 주시면 감사하겠습니다. 감사! 이를 달성하기

 var lineReader = require('readline').createInterface({ 
     input: require('fs').createReadStream(actualPlaylist) 
     }); 

     lineReader.on('line', async function(line){ 
     console.log('Line from file:', line); 
     url = line ? line.replace(/<(.+)>/i, '$1') : ''; 
     console.log(url); 
     try{ 
      var aVideo = await youtube.getVideo(url); 
     } catch(error) { 
      try{ 
      var myVideos = await youtube.searchVideos(line, 1); 
      var aVideo = await youtube.getVideoByID(myVideos[0].id); 
      } catch(myError) { 
      console.error(myError); 
      return msg.channel.send("Couldnt find any videos by that name."); 
      } 
     } 
     return handleVideo(aVideo, msg, voiceChannel, false); // This is a async function we create down below next to the 'play' function! 

     }); 
+1

안녕하세요, 귀하가 주문하려고하는 내용이 조금 분명하지 않습니다. 제목에 파일을 순서대로 보관하려고하지만 순서는 어떻게 되나요? 첫 곡부터 마지막 ​​곡까지? 아마도 당신이 말하는 파일의 예를 들어주세요. –

+0

죄송합니다. 문제를 해결하려고 조금 질문을 업데이트했습니다. – Dan

답변

0

한 가지 방법은 대기열을하고 다음 일을 시작했을 때 노래 취소]를 가지고하는 것입니다. 아마도 이런 것이있을 것입니다. 이 코드는 테스트되지 않았습니다. 행운을 빕니다!

/* globals youtube msg handleVideo voiceChannel */ 
var lineReader = require('readline').createInterface({ 
    input: require('fs').createReadStream('./playlist.txt') 
}) 

let songList = [] 
let called = false 

async function getSong (item) { 
    let aVideo 
    try { 
    aVideo = await youtube.getVideo(item.url) 
    } catch (error) { 
    try { 
     const myVideos = await youtube.searchVideos(item.line, 1) 
     aVideo = await youtube.getVideoByID(myVideos[0].id) 
    } catch (myError) { 
     console.error(myError) 
     return msg.channel.send('Couldnt find any videos by that name.') 
    } 
    } 
    return handleVideo(aVideo, msg, voiceChannel, false) 
} 

function videoQueue() { 
    if (!songList.length) { 
    called = false 
    return 
    } 
    const item = songList.unshift() 

    getSong(item) 
    .then(() => { 
     videoQueue() 
    }) 
    .catch(() => { 
     console.log('trying to play next song') 
     videoQueue() 
    }) 
} 

lineReader.on('line', async function (line) { 
    console.log('Line from file:', line) 
    const url = line ? line.replace(/<(.+)>/i, '$1') : '' 

    songList.push({url, line}) // {url, line} = {url:url, line:line} 
    if (!called) videoQueue() 
}) 
+0

가능한 빨리 시도해 보겠습니다. 감사! – Dan

+0

그것이 당신을 위해 작동하는 경우 대답을 수락하는 것을 잊지 마십시오 :) –