2015-10-29 10 views
13

चलाने के लिए async.times समाप्त हो जाए, तब तक मुझे प्रतीक्षा करने देंगी, मैं एक वेब अनुप्रयोग बनाने के लिए एक node.js सर्वर, Spotify API, और spotify-web-api-js नोड मॉड्यूल का उपयोग कर रहा हूं जहां उपयोगकर्ता किसी कलाकार का नाम दर्ज कर सकता है, संबंधित कलाकारों के गीतों की एक सूची देख सकता है, और उसके बाद वैकल्पिक रूप से उस प्लेलिस्ट को अपने स्वयं के Spotify खाते में सहेज सकता है। हालांकि, मुझे अभी भी अंतिम चरण में परेशानी हो रही है।कोई ईवेंट श्रोता कैसे चुनें, जब तक कि एक कार्य

मेरे उपयोगकर्ता प्राधिकरण प्रवाह पहले हो रहा है:

if (params.access_token) { 

    s.setAccessToken(params.access_token); 

    s.getMe().then(function(data) { 

     console.log(data); 
     console.log(data.id); 
     user_id = data.id; 

यह नीचे है जहां गाने के वास्तविक विवरण एपीआई द्वारा इकट्ठे हुए हैं। हालांकि यह कम हो गया है, यह पहले होता है और उपयोगकर्ता प्राधिकरण केवल तब होता है जब उपयोगकर्ता उस पृष्ठ पर दूसरे बटन पर क्लिक करता है।

async.times(counter, function(n, next){ 
     s.getArtistTopTracks(relatedArtists[n].id, "US", function (err, data2) { 
      relatedArtists[n].song = data2.tracks[0].name; 
      relatedArtists[n].uri = data2.tracks[0].uri; 
      console.log(relatedArtists[n].uri); 
      // make sure to put the access token here add song to playlist 
      // create array 
      song_uris.push(relatedArtists[n].uri); 
      console.log(song_uris); 

      // song_uris = relatedArtists[n].uri; 
      // 
      // console.log(song_uris); 

      next(null); 

     $("#playlist").load(function() { 
      s.addTracksToPlaylist(user_id, playlist_id, song_uris); 
      }); 
     }); 


     }, function(err) { 
     // console.table(relatedArtists); 

     for (k = 0; k < 20; k++) 
     { 
      $('#related-artist').append('<p><strong>' + relatedArtists[k].name + '</strong> -- \"' + relatedArtists[k].song + '\"</p>'); 


     } 

(JSBin of full code here, क्योंकि मैं अपने खुद के सर्वर पर browserify का उपयोग हालांकि यह काम नहीं कर सकते)

अभी, लाइन 114 पर मेरे पास है song_uris.push(relatedArtists[n].uri); एक सरणी में सामग्री धक्का, async.times का उपयोग कर। ,

s.createPlaylist(user_id, {name: 'Related Artist Playlist'}).then(function(data3) { 
     console.log(data3); 
     playlist_id = data3.uri; 
     playlist_id = playlist_id.substring(33); 
     console.log(playlist_id); 


     console.log(song_uris); 


     }); 

वहाँ, console.log(song_uris) एक खाली सरणी से पता चलता तो इसलिए की तरह addTracksToPlaylist() टूट जाता है: के बाद से इस जहाँ मैं लाइन 66 पर प्लेलिस्ट बनाने के नीचे है, यह एक खाली सरणी के रूप में दिखाता

enter image description here

दूसरी ओर, यदि मैं नीचे addTracksToPlaylist() करने का प्रयास करता हूं, तो मेरे पास उपयोगकर्ता के खाते तक पहुंचने का अधिकार नहीं है।

उपयोगकर्ता प्रमाणीकरण प्रवाह बाद में जोड़ा गया है कि गीतों की सूची दिखाने की मूल कार्यक्षमता पहले से ही काम कर रही है, लेकिन मुझे यकीन नहीं है कि उस सूची को मेरे उपयोगकर्ता की प्लेलिस्ट में सहेजने के लिए इसे प्रभावी ढंग से कैसे पुन: सक्रिय किया जाए। फिलहाल, मैं केवल Spotify खाते में एक खाली प्लेलिस्ट बना रहा हूं।

मैं किस प्रकार का इवेंट श्रोता जोड़ सकता हूं ताकि यह async.times के प्रत्येक उदाहरण को तब तक इंतजार कर सके जब addTracksToPlaylist() काम कर सके? इस डेटा को प्राप्त करने से पहले डीओएम पहले ही लोड हो चुका है। मैंने this question देखा, लेकिन इस समस्या को हल करने में मुझे काफी मदद नहीं मिली। धन्यवाद!

संपादित करें: अब मेरे पास song_uri सरणी है जिस तरह से मुझे इसकी आवश्यकता है, लेकिन मैं अभी भी प्लेलिस्ट में नहीं पहुंच सकता। मैं अपने एक्सेस टोकन के स्थान के साथ खेल रहा हूं ताकि मैं बनाई गई प्लेलिस्ट तक पहुंच सकूं, लेकिन अभी भी कोई भाग्य नहीं है।

लाइन 130 पर console.log(song_uris); बयान पूरा सरणी है कि मैं जरूरत से पता चलता है, लेकिन जब मैं इसे s.addTracksToPlaylist(user_id, playlist_id, song_uris); में डालने मैं डेवलपर कंसोल में इन त्रुटियों को मिलता है:

POST https://api.spotify.com/v1/users/tenderoni-/playlists/7MtQTzUsxD4IEJ8NmmE36q/tracks?uris= 400 (Bad Request) 
bundle.js:10616 
Uncaught (in promise) XMLHttpRequest {} 

असल में, यह कुछ के लिए पैरामीटर प्राप्त नहीं कर रहा है कारण। और मैं पहले से playlist_id लॉग इन करता हूं, इसलिए मैं इसे काम कर सकता हूं (साथ ही, मुझे अपने Spotify खाते में निर्दिष्ट शीर्षक के साथ रिक्त प्लेलिस्ट दिखाई देती हैं)।

पूर्ण अद्यतन यहाँ कोड: https://github.com/yamilethmedina/cs50xmiami/blob/master/assignments/portfolio/public/scripts.js

+0

क्या आप जेएसबीन पोस्ट में प्रमाण-पत्र शामिल करना चाहते थे? मैं यह नहीं बता सकता कि वे कुछ एपीआई दस्तावेज़ से हैं या यदि वे आपका हैं। –

उत्तर

2

कॉलबैक तर्क async करने के लिए।समय दूसरे 'परिणाम' तर्क ले सकते हैं, इसलिए यदि आप गीत के साथ 'अगली' कहते हैं तो आप लूप के प्रत्येक मोड़ के आसपास जाते हैं, तो आप अंत में song_uris प्राप्त कर सकते हैं, खोज कलाकारों के माध्यम से कॉलबैक पास कर सकते हैं, और वहां इसका उपयोग कर सकते हैं। कंकाल संस्करण:

$(document).ready(function($) { 
    $('#s').on('submit', function() { 
     searchArtists($('#originalartist').val(), function(err, song_uris) { 
      if (params.access_token) { 
       // omitted 
       s.setAccessToken(params.access_token); 
       s.getMe().then(function(data) { 
        console.log(data); 
        console.log(song_uris); 
       }); 
      } 
     }); 
     return false; 
    }); 
}) 

function searchArtists(originalArtist, callback) { 
    s.getArtistRelatedArtists(originalArtistId, function(err, data) { 
     async.times(counter, function(n, next) { 
      // omitted 
      next(related_artists[n].uri) 
     }, function(err, song_uris) { 
      callback(err, song_uris); 
     }); 

    }); 

} 
+0

'getMe()' फ़ंक्शन के भीतर, पहले भाग में होगा .createPlaylist() '? –

+0

हां, चूंकि आपको s.createPlaylist() को कॉल करने के लिए getMe() कॉलबैक से अभी भी user_id की आवश्यकता है। चूंकि GetMe() पहले से ही खोज कलाकारों को कॉलबैक के अंदर है, तो आप भी song_uris तक पहुंच पाएंगे। –

+0

मैंने देखा कि यह getArtistRelatedArtists() से async.times() तक कूदता है। नहीं चाहिए ArtistTopTracks() उन दो लाइनों के बीच में जाना चाहिए? Song_uris को पॉप्युलेट करने के लिए मुझे उस कार्य के माध्यम से प्रत्येक संबंधित कलाकारों का पहला गीत मिल रहा है। मुझे लगता है कि मुझे अपने शुरुआती कोड पर वापस जाना चाहिए और फिर इसे फिर से लागू करने का प्रयास करें, क्योंकि मुझे लगता है कि मैंने लूप को तोड़ने के लिए कुछ और गड़बड़ कर दिया है जो स्क्रीन पर प्लेलिस्ट प्रिंट करता है, गाने ब्राउज़र में अपरिभाषित के रूप में दिखाए जाते हैं लेकिन कंसोल नहीं , और जब मैं खाते में यातायात देखता हूं। spotify.com मुझे अब कोई कंसोल प्रतिक्रिया नहीं मिलती है। –

संबंधित मुद्दे