传递xhr onload函数的全局值

在我创build的应用程序中我有下面的XMLHttpRequest,我试图将xhr.onload()data结果传递到在同一个父函数内创build的数组中。

 var url = 'http://api.soundcloud.com/resolve.json?'+resource+'&'+CLIENT_ID; var xhr = new XMLHttpRequest(); xhr.open('GET', url, true); xhr.onload = function(){ var data = JSON.parse(xhr.responseText); console.log(data.permalink_url); }; xhr.send(); 

在这个下面我有一个数组的构build块,我试图将数据的结果传递到轨道string。

 var metadata = { id: val, title: title, url: posturl, track: data.permalink_url }; 

到目前为止,我所尝试过的一切都会返回undefined或者function ,现在我完全没有想法了。

Ajaxasynchronous执行(通常)。 这对于Ajax如何工作至关重要。 这意味着你不能指望onload方法何时会触发,或者即使触发。 这意味着所有依赖于xhr.responseText (HTTP请求的结果)的代码必须在callback本身内完成。 例如:

 xhr.onload = function () { // This will execute second doStuffWithData(JSON.parse(xhr.responseText)); } // This will execute first xhr.send(); var anything = anythingElse; 

就像我在我之前回答的评论中所说的那样 ,你可以把一行改为xhr.open('GET', url, false) 。 这将使请求同步,并将阻止其他一切运行,直到请求完成。 它将允许您访问xhr.responseText而无需等待onload函数。

 CLIENT_ID = 'client_id=xxx'; var src = track, match = src.match(/url=([^&]*)/), resource = match[0], stream = decodeURIComponent(match[1]) + '/stream/?' + '&' + CLIENT_ID; var url = 'http://api.soundcloud.com/resolve.json?' + resource + '&' + CLIENT_ID; var xhr = new XMLHttpRequest(); xhr.open('GET', url, false); xhr.send(); parsedResults.push({ title: title, track: JSON.parse(xhr.responseText) }); 

你可以在这里看到它的行动 。 Chrome出于某种原因似乎被打破了。 尽pipe在Firefox中工作。 我认为这是与CORS + 302redirect+同步请求有关。

我已经为爆炸药解决scheme。 我遇到的唯一问题是,每次运行节点应用程序时,抓取的链接并不总是以相同的顺序返回。 实际上,他们应该按照它们被抓取的顺序返回(这将是最新的post,对吧?)但是情况并非总是如此?