我一直在试图自己解决这个问题(刚开始使用NodeJS进行工作),并且在Google的帮助下,但我仍然无法找到如何做我想做的事情。
这是我要实现的目标: 1.调用Clash of Clans API并从我的部落获取成员,我可以借助请求模块(https://github.com/request/request)
到目前为止的代码:
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问题,因此我将同时标记这两个问题,并希望比我有更好知识的人能为我指明正确的方向。
答案 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下载软件包。 通过异步等待,您可以使代码看起来是同步的(但仍然是异步的)。 回调方法已经很老了,如果有多个回调,您的代码可能很难看懂。