2015-09-14 106 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设置后。