全局传递xhr onload函数的值

时间:2013-11-26 02:26:02

标签: javascript json node.js xmlhttprequest

在我正在创建的应用程序中,我有以下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
      };

到目前为止,我尝试的所有内容都会返回undefinedfunction,现在我完全没有想法......

3 个答案:

答案 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解决方案。我遇到的唯一问题是,每次运行节点应用程序时,被抓取的链接并不总是以相同的顺序返回。实际上他们应该按照他们被抓取的顺序返回(这将是最新的帖子,对吧?)但是情况并非总是如此?