使用Promises和xmlhttpRequests从github获取公共用户数据?

时间:2018-11-10 22:41:56

标签: javascript node.js

我正在尝试使用url从github获取用户数据,我是处理API的新手。我尝试遵循github-api,但是那里的代码对我来说意义不大。我了解了promise的概念,因此我尝试将此stackoverflow answer与promise结合使用,并尝试如下实现它。我正在使用节点。

var XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;

var request = new XMLHttpRequest();

function pr() {
  return new Promise(function(resolve, reject) {
    request.open('get', 'https://api.github.com/users/$username')
    request.send();
    resolve(request.response);
  });
}

var gitpr = pr();
gitpr.then(function() {
  console.log(request.response);
})

我的request.response [[PromiseValue]]在运行节点中的代码时未定义。

如果我遵循此stackoverflow answer(与上面相同),则控制台中的结果是正确的。

1 个答案:

答案 0 :(得分:2)

您没有做任何事情来等待请求返回!

当请求以onreadystatechange完成时,XMLHttpRequest将通知您

下面是一个实现您的目标的pr()函数,假设“ $ username”是有意义的。

注意:我已将请求对象放入函数中以进行更好的封装,并通过resolve将响应的值传达给调用方:

function pr() {
  var request = new XMLHttpRequest();
  return new Promise(function(resolve, reject) {
    request.onreadystatechange = function() {
      if (request.readyState == 4) {
        resolve(request.responseText);
      }
    }
    request.open('get', 'https://api.github.com/users/$username', true)
    request.send();
  });
}

resolve然后将响应的responseText成员发送到正在等待Promise的第一个函数的值的函数:

pr().then(function(val) {
  console.log(val)
}, function(err) {
  console.log(err)
}) 

在pr()函数中,我们没有调用reject(),因此不能调用err函数,但是例如,检查错误状态代码并调用{{1} }。