2017-04-07 174 views
1

我有一个剧本,我想从一个端点获取一些JSON数据,但我得到一个错误,这是我的脚本:E6 Ajax请求不工作

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); 
    }); 

然后,在控制台它抛出一个错误:

Error at XMLHttpRequest.request.onreadystatechange (app.js:11) at app.js:18 at Promise() at httpGet (app.js:2) at app.js:25

+2

只是好奇...为什么不使用['Fetch API'](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API)? – Andreas

+0

@Andreas:可能想要支持IE? –

+0

除了api url以外,似乎对我来说运行良好。你使用的是什么浏览器? – epascarello

回答

1

你不能只检查status,你必须检查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(); 
     }); 
} 

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

+1

虽然这不会引发错误,对吗?难道它不是早点触发Promise'catch'吗? – CodingIntrigue

+0

@CodingIntrigue:这是一个很好的观点,它对我非常激动,我不记得引用错误。所以我想知道'this.response'是否正在抛出,但[规范](https://xhr.spec.whatwg.org/#the-response-attribute)如果您访问得太早,不会说出它。编辑:啊,铬尽管规范抛出... –

+0

现在这个作品,我可以获取数据,与您的代码 – Leff