Async.series:变量在函数外部未定义

时间:2015-09-14 01:24:14

标签: node.js asynchronous request

我是Node / Javascript的新手,并尝试通过加载其他网址audioLink来抓取网址songLink。然后我会将它们添加到新对象rapSong。为了实现这一点,我使用异步系列,以便调用异步发生。我尝试过其他方法,比如使用异步瀑布和回调没有成功。

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");
                });

1 个答案:

答案 0 :(得分:0)

在您的第一个async.series函数中,在调用getAudioLink的回调之前,您不应该调用其回调。

所以移动<{1}}调用里面的代码回调:

getAudioLink

这样getAudioLink(songLink, function(resp){ audioLink = resp; console.log("one"); console.log("two"); callback(); }); 一直持续到设置async.series之后。