在我正在创建的应用程序中,我有以下XMLHttpRequest,并且我试图将data
内的xhr.onload()
结果传递到在同一父函数中创建的数组中。
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();
下面我有一个数组的构建块,我试图将数据结果传递给轨道字符串。
var metadata = {
id: val,
title: title,
url: posturl,
track: data.permalink_url
};
到目前为止,我尝试的所有内容都会返回undefined
或function
,现在我完全没有想法......
答案 0 :(得分:5)
Ajax异步执行(通常)。这对于Ajax的工作方式至关重要。这意味着,当onload
方法触发时,你不能指望,如果它会触发。这意味着依赖于xhr.responseText
(HTTP请求的结果)的所有代码都必须在回调本身内完成。例如:
xhr.onload = function () {
// This will execute second
doStuffWithData(JSON.parse(xhr.responseText));
}
// This will execute first
xhr.send();
var anything = anythingElse;
答案 1 :(得分:1)
就像我在my previous answer的评论中所说,您可以将一行更改为xhr.open('GET', url, false)
。它将使请求同步,并在请求完成之前阻止其他所有内容运行。它允许您在不等待onload函数的情况下访问xhr.responseText
。
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)
});
你可以see it in action here。由于某些原因,它似乎在Chrome中被打破了。但在Firefox中可以使用。我认为这与CORS + 302重定向+同步请求有关。
答案 2 :(得分:0)
我选择了Explosion Pills解决方案。我遇到的唯一问题是,每次运行节点应用程序时,被抓取的链接并不总是以相同的顺序返回。实际上他们应该按照他们被抓取的顺序返回(这将是最新的帖子,对吧?)但是情况并非总是如此?