2015-09-14 142 views
0

我是新來的Node/Javascript,並試圖通過加載另一個url songLink來獲取URL audioLink。然後,我會將它們添加到一個新對象rapSong。爲了實現這一點,我使用異步系列,以便調用將異步發生。我嘗試了其他方法,例如使用異步瀑布和只是回調沒有成功。Async.series:函數外部未定義變量

audioLinkundefined,除非我在getAudioLink函數內。此外,async.series中的函數不能以正確的順序運行。有什麼建議?

//for each song.. 
songLinkElem.each(function(i, s) {    
      var songName = StringUtils.removeWhiteSpacesAndNewLines($(s).children(".title_with_artists").text()); 
      var songLink = $(s).attr("href"); 
      var audioLink; 

      async.series([ 
       function(callback){ 
        function getAudioLink(songLink, callback){ 
        request(songLink, function(err,resp,body){ 
         $ = cheerio.load(body); 
         var audioElem = $(body).find(".audio_link > a"); 
         var audioLink = audioElem.attr("href"); 
         return callback(audioLink); 
        }); 
       } 

        getAudioLink(songLink, function(resp){ 
         audioLink = resp; 
         console.log("one"); 
        }) 

        console.log("two"); 
        callback(); 
       }, 
       function(callback){ 
        var rapSong = new Song(songName, artistLink, songLink, audioLink); 
        rapArtist.addSong(rapSong); 
        console.log("three"); 
        callback(); 
       }], 
       function(err, result){ 
        console.log("four"); 
       }); 

回答

0

在你的第一個async.series功能,你不應該調用它的回調,直到getAudioLink回調被調用。

所以移動遵循內部其回調的getAudioLink呼叫代碼:

getAudioLink(songLink, function(resp){ 
    audioLink = resp; 
    console.log("one"); 
    console.log("two"); 
    callback(); 
}); 

這樣的async.series將不會繼續進行,直到audioLink設置後。