我一直试图自己解决这个问题(刚刚开始使用NodeJS),并且在谷歌的帮助下,但却无法找到如何做我想做的事情。
以下是我想要实现的目标: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位
我想这更像是一个JavaScript问题,而不是NodeJS问题,所以我会标记两者,并希望知识比我更好的人可以指出我正确的方向。
解决这个问题的最好方法是使用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 await
从npm请求和请求承诺下载包。通过异步等待,您可以使代码看起来同步(但仍然是异步的)。回调方法很老,如果你有多个回调,你的代码很难读。