Javascript E6 Ajax请求不工作

Javascript E6 Ajax请求不工作,javascript,ajax,ecmascript-6,Javascript,Ajax,Ecmascript 6,我有一个脚本,我想从端点获取一些json数据,但我得到一个错误,这是我的脚本: function httpGet(url) { return new Promise( function (resolve, reject) { var request = new XMLHttpRequest(); request.onreadystatechange = function () { if (th

我有一个脚本,我想从端点获取一些json数据,但我得到一个错误,这是我的脚本:

function httpGet(url) {
    return new Promise(
        function (resolve, reject) {
            var request = new XMLHttpRequest();
            request.onreadystatechange = function () {
                if (this.status === 200) {
                    // Success
                    resolve(this.response);
                } else {
                    // Something went wrong (404 etc.)
                    reject(new Error(this.statusText));
                }
            }
            request.onerror = function () {
                reject(new Error(
                    'XMLHttpRequest Error: '+this.statusText));
            };
            request.open('GET', url);
            request.send();
        });
}

var url = 'https://api.jsonPlaceholder.com';

httpGet(url)
  .then(JSON.parse)
  .then((r) => {
    console.log(r);
  }).catch(function(error) {
    console.log(error);
  });
然后,在控制台中抛出一个错误:

错误 在XMLHttpRequest.request.onreadystatechange(app.js:11) app.js:18 允诺 在httpGet上(app.js:2) app.js:25


您不能只检查
状态
,您必须先检查
readyState==4
,然后才能决定发生了什么:

function httpGet(url) {
    return new Promise(
        function (resolve, reject) {
            var request = new XMLHttpRequest();
            request.onreadystatechange = function () {
                if (this.readyState === 4) {                            // ***
                    if (this.status === 200) { 
                        // Success
                        resolve(this.response);
                    } else {
                        // Something went wrong (404 etc.)
                        reject(new Error(this.statusText));
                    }
                }                                                       // ***
            }
            request.onerror = function () {
                reject(new Error(
                    'XMLHttpRequest Error: '+this.statusText));
            };
            request.open('GET', url);
            request.send();
        });
}

在请求完成之前访问
this.response
应该只返回一个空字符串,但是对于我使用Chrome v57的用户来说,这样做会导致您引用的错误。添加
readyState
检查可以修复它。

只是好奇。。。你为什么不使用?@Andreas:可能想支持IE?对我来说似乎运行得很好,但api url不好。您使用的浏览器是什么?@Leff如果需要,也不要忘记required@Andreas:OP使用了一些ES2015功能,可能是传输功能,包括Promise polyfill。当然,他/她也可以包含一个
fetch
polyfill…:-)但这不会引发错误,是吗?这难道不会提前触发承诺吗?@codingtrigue:“这是一个很好的观点,它跳到了我身上,我不记得去想引用的错误。所以我想知道
this.response
是否抛出,但如果您过早访问它,我没有说应该抛出。编辑:啊,Chrome是抛出的,尽管有规范……这现在起作用了,我可以用你的代码获取数据。如果这起作用了,那么我想这毕竟不是抛出的错误——只是日志output@CodingIntrigue:Chrome在请求完成之前访问
此响应时会抛出错误,尽管该规范已在本地复制,OP引用的确切错误。非常令人惊讶。