Как перейти на callback nodejs - PullRequest
       23

Как перейти на callback nodejs

0 голосов
/ 20 марта 2019

Мне нужно преобразовать этот код в чистый код, который использует обратные вызовы, потому что этот код не позволяет мне использовать информацию о теле в другом месте.

const endpoints = [];

function getDevicesFromPartnerCloud() {
  var options = {
    method: 'GET',
    url: 'https://database-dcda.restdb.io/rest/endpoints',
    headers: {
      'cache-control': 'no-cache',
      'x-apikey': '*****************************'
    }
  };
  request(options, function (error, response, body) {
    var data = JSON.parse(body);
    data.forEach(function(data, index) {
      let endpoint = createSceneEndpoint(data._id, data.name);
      endpoints.push(endpoint);
    });
  });
  return endpoints;
}

1 Ответ

0 голосов
/ 20 марта 2019

Я думаю, что самый простой способ сделать это - использовать Promise для обработки асинхронного request.Одна из самых важных вещей, которую следует помнить, заключается в том, что в идеале функции должны выполнять только одну вещь.Таким образом, их легче тестировать, рассуждать и реорганизовывать.Я бы вытащил код, который фактически делает запрос, в отдельную функцию, чтобы он возвращал тело, а затем попросил getDevicesFromPartnerCloud вызвать эту новую функцию, вернуть данные и обработать их так, как хочет.Самое главное, это «освобождает» данные от застревания в обратном вызове request, потому что вы заключаете их в обещание и разрешаете их, когда данные доступны.

Что-то вроде:

const endpoints = [];

function requestDevices() {
  return new Promise(function(resolve, reject) {
    const options = {
      method: 'GET',
      url: 'https://database-dcda.restdb.io/rest/endpoints',
      headers: {
        'cache-control': 'no-cache',
        'x-apikey': '*****************************',
      },
    };

    request(options, function(error, response, body) {
      if (error) {
        reject(error)
      }

      resolve({ response: response, body: body });
    });
  });
}

async function getDevicesFromPartnerCloud() {
  const devicesResponse = await requestDevices();
  const data = JSON.parse(devicesResponse.body);
  data.forEach(function(data, index) {
    const endpoint = createSceneEndpoint(data._id, data.name);
    endpoints.push(endpoint);
  });

  // Do whatever else you need with devicesResponse.body

  return endpoints;
}

Если вы хотите пойти в направлении es6, возможно, что-то вроде

let endpoints;

const requestDevices = () =>
  new Promise((resolve, reject) => {
    request(
      {
        method: 'GET',
        url: 'https://database-dcda.restdb.io/rest/endpoints',
        headers: {
          'cache-control': 'no-cache',
          'x-apikey': '*****************************',
        },
      },
      (error, response, body) => (error ? reject(error) : resolve(body)),
    );
  });

const getDevicesFromPartnerCloud = async () => {
  try {
    const body = await requestDevices();
    const data = JSON.parse(body);
    endpoints = data.map(({ _id, name }) =>
      createSceneEndpoint(_id, name),
    );

    // Do whatever else you need with devicesResponse.body
    // doStuff(body)

    return endpoints;
  } catch (e) {
    console.error(e);
  }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...