全局传递xhr onload函数的值

Pass the value of an xhr onload function globally

本文关键字:函数 onload xhr 全局      更新时间:2023-10-03

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

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,现在我完全没有想法了。。。

Ajax异步执行(通常)。这对Ajax的工作方式至关重要。这意味着,当onload方法将触发时,您不能指望,如果将触发,甚至不能指望<em。这意味着所有依赖于xhr.responseText(HTTP请求的结果)的代码都必须在回调本身中完成。例如:>

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

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中似乎已损坏。不过可以在Firefox中使用。我认为这与CORS+302重定向+同步请求有关。

我选择了爆炸药丸解决方案。我遇到的唯一问题是,每次运行节点应用程序时,被爬网的链接并不总是以相同的顺序返回。现实地说,他们应该按照爬行的顺序返回(哪一个会是最新的帖子,对吧?)然而,情况并非总是如此?