1

我有一个简单的脚本,它执行跨站点请求并从 GitHub gist 获取数据。来自 Github API 的数据以 JSON 字符串形式返回。为了允许进一步修改数据,我希望它是一个 JSON 对象。

// Create the XHR object.
function createCORSRequest(method, url) {
  var xhr = new XMLHttpRequest();
  if ("withCredentials" in xhr) {
    // XHR for Chrome/Firefox/Opera/Safari.
    xhr.open(method, url, true);
  } else if (typeof XDomainRequest != "undefined") {
    // XDomainRequest for IE.
    xhr = new XDomainRequest();
    xhr.open(method, url);
  } else {
    // CORS not supported.
    xhr = null;
  }
  return xhr;
}

var tmpJSON = "";
var gistData = "";

var gistID = "5789756";
var gitAPI = "https://api.github.com/gists/"
var gistQuery = gitAPI + gistID;

function incrementGist() {
    gistData = createCORSRequest('GET', gistQuery);
    gistData.send();
    tmpJSON = JSON.parse(gistData.response);
}

在html页面中,我有

<p><input type="button" value="Increment" OnClick="incrementGist()"></p>

如果我真的按下按钮,我得到的错误是:

Uncaught SyntaxError: Unexpected end of input 

但是如果我随后打开控制台并运行它:

var crap = JSON.parse(gistData.response);

它工作得很好。这在 Firefox 和 Chrome 中都会发生。我真的不明白为什么JSON.parse命令在函数调用中失败,但在控制台中却没有。这里设置了一个实际的页面

4

2 回答 2

3

问题是您试图在服务器回答之前读取响应。

您必须在回调中阅读响应。例如 :

gistData = createCORSRequest('GET', gistQuery);
gistData.onreadystatechange = function() {
if (gistData.readyState === 4) {
    if (gistData.status === 200) {
                 tmpJSON = JSON.parse(gistData.response);
                 ... use tmpJSON...
                 ... which should not be called so as it is not JSON...
                 ... maybe tmpObject ?
            }
    }
}
gistData.send();
于 2013-06-17T13:35:57.447 回答
1

那是因为您没有等待请​​求真正完成。我不知道您的 API,但尝试等待服务器响应然后解析您的 JSON。您可以先尝试使用 SetTimeout 以查看它是否正常工作,但您需要在 jQuery 中使用其success:function(...)回调执行类似操作

于 2013-06-17T13:38:41.153 回答