2015-09-15 93 views
1

当我触发一个click事件,该函数运行:无法流星事件访问变量

'click h2.start1': function() { 
     var genreName; 
     //generate random number 
     function getGenreNumber() { 
     numGenre = Math.floor((Math.random() * 500) + 1); //total genres: 1381 
     console.log('genre index number: ' + numGenre); 
     return numGenre 
     }; 
     //http.get genre with number genre/list 
     function getGenreName() { 
     HTTP.get('someurl', 
     {}, 
     function (error, result) { 
      if (result.statusCode === 200) { 
      genreName = result.data.response.genres[numGenre].name; 
      console.log('The genre is: ' + genreName); 
      } 
     return genreName 
     }); 
     }; 
     //http.get 15 artists of genre genre/artist 
     function getGenreArtists() { 
     console.log('genreName is: ' + genreName); //this is undefined 
     HTTP.get('someurl' + genreName, 
     {}, 
     function (error, result) { 
      if (result.statusCode === 200) { 
      console.log(result.data.response); 
      console.log(genreName); 
      }else { 
      console.log("something broke"); 
      console.log(genreName); //this is exactly as it should be! 
      } 
     }); 
     }; 
     getGenreNumber() 
     getGenreName() 
     getGenreArtists() 
}, 

我试图做两件事情,第一,有传递到URL中的变量genreName的价值功能getGenreArtists中的GET请求。

getGenreArtists中的第一个console.log会返回undefined,但行“something broke”下的console.log会正确返回。

我很困惑,因为两个函数都具有相同的范围,并且因为函数getGenreName能够正确访问变量numGenre

我想要做的第二件事是用+genreName替换任何空格,这样GET请求的url将被正确格式化。

回答

0

这是一个普通的异步问题。一般来说,如果你想用异步事件的数据做一些事情,你需要传递一个回调(或者使用promise)。举个例子,你getGenreName看起来更像是这样的:

function getGenreName(callback) { 
    HTTP.get('someurl', {}. function (error, result) { 
    if (result.statusCode === 200) { 
     callback(result.data.response.genres[numGenre].name); 
    } 
    }); 
} 

然后调用它像这样:

getGenreName(function (name) { 
    console.log('the name of the genre is: ' + name); 
}); 
+0

同意 - 变量genreName由回调getGenreName()试图读取它后置第一次(getGenreArtists func的第2行),但在getGenreArtists中的回调被调用之前。 – JeremyK

+0

为什么我不使用return语句而不是console.log来将字符串传递给url? –

+0

因为这会导致阻塞,直到HTTP请求完成。有了回调方法,你基本上是在它到达结果时做一个动作,但立即返回控制。这在javascript中更常见。 – corvid