Я пытался понять это самостоятельно (только начал работать с NodeJS), а также с помощью Google, но не совсем смог понять, как делать то, что я хочу делать.
Вот чего я пытаюсь достичь: 1. Вызвать API Clash of Clans и получить членов из моего клана, я могу сделать с помощью модуля запроса (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.info("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, 64-разрядная версия Windows 8
Я предполагаю, что это больше вопрос JavaScript, чем вопрос NodeJS, поэтому я отмечу оба и надеюсь, что кто-то с лучшими знаниями, чем я, может указать мне правильное направление.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Давайте использовать обещание + асинхронное ожидание
Загрузите пакет из npm request и request-promise. С помощью async await вы можете сделать свой код синхронным (но все же асинхронным). Метод обратного вызова довольно старый, и ваш код может быть трудночитаемым, если у вас есть несколько обратных вызовов.
Лучший способ решить эту проблему — использовать Обещания. Они используются в сочетании с механизмом под названием асинхронно/ожидание, синтаксис которого упрощает работу с промисами. Я предлагаю вам прочитать приведенные выше ссылки, чтобы понять, как эти вещи работают.
Вот ваш текущий код, переписанный для использования промисов.
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.info("Added member", member.id);
}
console.info(members[0]);
}
run();
Теперь, когда ваш код может поддерживать промисы, вы можете добавлять запрос в каждую итерацию цикла 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.info("Added member", member.id);
}
Это удаляет вашу обработку ошибок, которую вы можете повторно реализовать с помощью Попробуйте поймать.
Это то, что я пытаюсь понять, хотя не знаю, как это сделать. Не могли бы вы предоставить мне пример кода?