Несколько запросов NodeJS?

Я пытался понять это самостоятельно (только начал работать с NodeJS), а также с помощью Google, но не совсем смог понять, как делать то, что я хочу делать.

Вот чего я пытаюсь достичь: 1. Вызвать API Clash of Clans и получить членов из моего клана, я могу сделать с помощью модуля запроса (https://github.com/request/request)

  1. После загрузки всех участников я хотел бы еще раз вызвать API для каждого участника и получить их личную статистику, вот где я борюсь. Из того, что я прочитал и понял, я должен использовать промисы?

Код пока:

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, поэтому я отмечу оба и надеюсь, что кто-то с лучшими знаниями, чем я, может указать мне правильное направление.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
110
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Давайте использовать обещание + асинхронное ожидание

Загрузите пакет из npm request и request-promise. С помощью async await вы можете сделать свой код синхронным (но все же асинхронным). Метод обратного вызова довольно старый, и ваш код может быть трудночитаемым, если у вас есть несколько обратных вызовов.

Это то, что я пытаюсь понять, хотя не знаю, как это сделать. Не могли бы вы предоставить мне пример кода?

Andreas Ellsen 13.03.2019 20:52
Ответ принят как подходящий

Лучший способ решить эту проблему — использовать Обещания. Они используются в сочетании с механизмом под названием асинхронно/ожидание, синтаксис которого упрощает работу с промисами. Я предлагаю вам прочитать приведенные выше ссылки, чтобы понять, как эти вещи работают.

Вот ваш текущий код, переписанный для использования промисов.

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);
  }

Это удаляет вашу обработку ошибок, которую вы можете повторно реализовать с помощью Попробуйте поймать.

Другие вопросы по теме