繁体   English   中英

NodeJS有多个请求?

[英]NodeJS multiple requests?

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

这是我要实现的目标:1.调用《部落冲突》 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的问题,因此,我将同时标记这两个问题,并希望知识比我更好的人可以为我指明正确的方向。

解决此问题的最佳方法是使用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重新实现。

让我们使用promise + async等待

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM