2017-11-24 14 views
0

私はyoutube apiからplaylistIdを取得しています。youtube search api関数の外で変数が未定義です

YouTubeの検索機能の中でコンソール出力が正しく出力されます。

YouTubeの検索APIの外に未定義の機能があります。

var playlistId; 
async function suggestTrack(genre) { 

    youtube.search.list({ 
     auth: config.youtube.key, 
     part: 'id,snippet', 
     q: genre 
    }, function (err, data) { 
     if (err) { 
     console.error('Error: ' + err); 
     } 
     if (data) { 
     console.log(data.items[0].id.playlistId); //getting the id 
     playlistId = data.items[0].id.playlistId; 

     } 
     //process.exit(); 
    }); 

    console.log(playlistId);// undefined 

const tracks = await youtube_api.getPlaylistTracks(playlistId); 
return tracks[Math.floor(tracks.length * Math.random())]; 

} 

答えて

2

APIコールは非同期です。そして、あなたはAPIの応答が戻ってくる前にplaylistIdの値を表示しています。あなたは応答が来るのを待たなければなりません。また、asyncを使用しているので、PromiseでAPI呼び出しをラップし、awaitを使用してください。 search.list方法をpromisifyするには、あなたは多くのオプションを持っている、またはあなたがそれを自分で行うことができ、

function search(key, part, genre) { 
    return new Promise((resolve, reject) => { 
    youtube.search.list({ 
     auth: key, 
     part: part, 
     q: genre 
    }, function (err, data) { 
     if (err) { 
     reject(err); 
     return; 
     } 
     // use better check for playlistId here 
     resolve(data ? data.items[0].id.playlistId : null); 
    }) 
    }); 
} 

// then use it here 
async function suggestTrack(genre) { 
    const playlistId = await search(config.youtube.key, 'id,snippet', genre);  
    const tracks = await youtube_api.getPlaylistTracks(playlistId); 
    return tracks[Math.floor(tracks.length * Math.random())]; 
} 
2

youtube.search.list以下のような非同期です。同期プロセスの一部であるため、playlistIdにアクセスしようとしています。

の中にyoutube.search.listを入れると、簡単に使用できます。


OLD WAYノードV8で使用可能

function wrappedSearch() { 
    return new Promise((resolve, reject) => { 
    youtube.search.list({ 
     auth: config.youtube.key, 
     part: 'id,snippet', 
     q: genre 
    }, (err, data) => { 
     if (err) { 
     console.error('Error: ' + err); 

     return reject(err); 
     } 

     return resolve((data && data.items[0].id.playlistId) || false); 
    }); 
    }); 
} 

async function suggestTrack(genre) { 
    const playlistId = await wrappedSearch(); 

    // Here playlistId is either the playlistId, either false 

    console.log(playlistId); 

    const tracks = await youtube_api.getPlaylistTracks(playlistId); 

    return tracks[Math.floor(tracks.length * Math.random())]; 
} 

NEW WAY

doc

tutorial
const { 
    promisify, 
} = require('util'); 

const youtubeSearchAsync = promisify(youtube.search.list); 

async function suggestTrack(genre) { 
    const data = await youtubeSearchAsync({ 
     auth: config.youtube.key, 
     part: 'id,snippet', 
     q: genre 
    }); 

    const playlistId = (data && data.items[0].id.playlistId) || false; 

    console.log(playlistId); 

    const tracks = await youtube_api.getPlaylistTracks(playlistId); 

    return tracks[Math.floor(tracks.length * Math.random())]; 
} 
+0

新しい方法では動作しません...データが定義されていません –

+0

@YaShChaudhary私はvarの名前を間違えました。私はそれを変更したばかりです –

関連する問題