NodeJS有多个请求?

时间:2019-03-13 19:21:39

标签: javascript node.js

我一直在试图自己解决这个问题(刚开始使用NodeJS进行工作),并且在Google的帮助下,但我仍然无法找到如何做我想做的事情。

这是我要实现的目标: 1.调用Clash of Clans API并从我的部落获取成员,我可以借助请求模块(https://github.com/request/request

  1. 加载所有成员后,我想为每个成员再次调用API并获取其个人统计信息,这就是我在努力的地方。根据我已阅读和理解的内容,我应该使用Promises吗?

到目前为止的代码:

var request = require('request');
var members = new Array();

var options = {
    url: 'https://api.clashofclans.com/v1/clans/%238Y89PVOY',
    headers: {
        'Accept': 'application/json',
        'authorization': 'Bearer my-auth-code'
    }
};

function memberCallback(error, response, body) {

    if (!error && response.statusCode == 200) {

        var members = JSON.parse(response.body)["memberList"];

        for (var member in members){

            var ClashMember = {
                name : members[member].name,
                role : members[member].role
            };

            members.push(ClashMember);

            console.log("Added member");

        }
    }
}

request(options, memberCallback);

// Code to call the api again for each member and get their personal stats

我正在使用以下内容:

节点v10.15.3,npm v6.4.1,Windows 8 64位

我想这不是每个发言者说的NodeJS问题,而是JavaScript问题,因此我将同时标记这两个问题,并希望比我有更好知识的人能为我指明正确的方向。

2 个答案:

答案 0 :(得分:1)

解决此问题的最佳方法是使用Promises。这些与称为async/await的机制结合使用,该机制使处理Promises更加容易。我建议您阅读以上链接以了解这些工作原理。

这是您当前的代码,已重写为使用Promises。

const request = require("request-promise");

async function run() {
  const members = [];

  const options = {
    url: "https://api.clashofclans.com/v1/clans/%238Y89PVOY",
    headers: {
      Accept: "application/json",
      authorization: "Bearer my-auth-code"
    },
    json: true
  };

  const response = await request(options);
  const memberList = response.memberList;

  for (const member of memberList) {
    const ClashMember = {
      name: member.name,
      role: member.role,
    };

    members.push(ClashMember);

    console.log("Added member", member.id);
  }

  console.log(members[0]);
}

run();

现在您的代码可以支持promise,您可以将请求添加到for循环的每个迭代中,并且它将按预期工作。可以做到这一点。

  for (const member of memberList) {
    const memberInformationOptions = {
      // options for this request
    };
    const memberInformation = await request(memberInformationOptions);

    const ClashMember = {
      name: member.name,
      role: member.role,
      extraInformation: memberInformation.body
    };

    members.push(ClashMember);

    console.log("Added member", member.id);
  }

这消除了您的错误处理,您可以使用try/catch重新实现。

答案 1 :(得分:0)

让我们使用承诺+异步等待

从npm request和request-promise下载软件包。 通过异步等待,您可以使代码看起来是同步的(但仍然是异步的)。 回调方法已经很老了,如果有多个回调,您的代码可能很难看懂。