NodeJS有多个请求?

问题描述 投票:0回答:2

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

以下是我想要实现的目标: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位

我想这更像是一个JavaScript问题,而不是NodeJS问题,所以我会标记两者,并希望知识比我更好的人可以指出我正确的方向。

javascript node.js
2个回答
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重新实现。


0
投票

让我们使用promise + async await

从npm请求和请求承诺下载包。通过异步等待,您可以使代码看起来同步(但仍然是异步的)。回调方法很老,如果你有多个回调,你的代码很难读。

© www.soinside.com 2019 - 2024. All rights reserved.