Как вернуть две функции в одной функции в Javascript - NodeJS и ExpressJS - PullRequest
0 голосов
/ 19 июня 2020

У меня возникла проблема: мне нужно объединить объекты и вернуть их в одной функции. Проблема в том, что для обоих объектов у меня почти одинаковые свойства, но значения разные.

Итак, я создал две отдельные функции, каждый из которых имеет один и тот же объект, почти одинаковые реквизиты, значения различий. Внутри каждой функции у меня есть URL-адрес, который вызывается в обоих случаях по-разному: case1 = skoda, case2 = toyota.

Проблема в том, что я не знаю, как сделать вызовы diff get (я добавил комментарий там), чтобы обе машины возвращались в одной функции, чтобы они были перечислены в одной ссылке xml. Теперь каждая машина находится по отдельной xml ссылке, потому что они находятся в двух отдельных файлах. Теперь должна быть одна ссылка, и я не могу понять, как это сделать.

Пожалуйста, кто-нибудь может мне немного помочь?

const env = process.env.NODE_ENV || 'development';
const apiUrl = config.api[env];

  const skodaParams = {
    categoryId: 'skoda',
    limit: 1000,
    offset: 0
  };

  const toyotaParams = {
    categoryId: 'toyota',
    limit: 1000,
    offset: 0
  };

const generateSkoda = skoda => {
  // a lot of code for skoda prop
  const skodaList = {
    'g:id': product.carId
    'g:brand': product.brand,
    'g:color': product.color
    'g:teamSkoda: 'Skoda'
  }

  return skodaList;
}

const generateToyota = toyota => {
  // a lot of code for toyota prop
  const skodaList = {
    'g:id': product.carId
    'g:brand': product.brand,
    'g:color': product.color,
    'g:teamToyota: 'Toyota'
  }

  return skodaList;
}

const getSkoda = () => {
  return axios.get(apiUrl, { params: skodaParams });
}
const getToyota = () => {
  return axios.get(apiUrl, { params: toyotaParams });
}


const createBothCars = () => { 

  // here I wanted to add some how two axios get calls for both skoda and toyota
  return axios
    .all([getSkoda(), getToyota()])
    .then(response => {
      console.log('response', response);

      const skodaArray = [];

      response.data.skoda.map(item => {
        return skodaArray.push(generateSkoda(item));
      })

      const Obj = {
        feed: {
          $: {
            xmlns: 'http://www.w3.org/2005/Atom',
            'xmlns:g': 'http://base.google.com/ns/1.0'
          },
          title: 'Skoda cars list',
          link: {
            $: {
              rel: 'self',
              href: config.domain
            }
          },
          entry: skodaArray
        }
      };

      const objBuilder = new xml2js.Builder({
        cdata: true
      });

      return objBuilder.buildObject(Obj);
    })
    .catch(error => {
      console.log(error);
    });
};

module.exports = createXml;

И на сервере. js I have:

const createXml = require('../src/xml/createXml');

app
  .prepare()
  .then(() => {
    const server = express();

server.get('/both-cars.xml', (req, res) => {
      res.header('Content-Type', 'application/xml');
      (async function sendXML() {
        const xmlFile = await createXml();
        res.send(xmlFile);
      })();
    });

Update

Я обновил код с помощью ax ios .all, следуя комментарию, но в ответе я не получаю значений из обеих функций, но я получаю значения из последней функции, указанной в этом массиве:

[getSkoda (), getToyota ()]

теперь я получаю значения только из getToyota,

data: {
      filters: [Array],
      skoda: [],
      toyota: [Array],
      _version: 'Fri Jun 19 14:43:47 EEST 2020',
      errorCode: 'no_error'
    }

если я переключу порядок [getToyota (), getSkoda ()], я получу только значения из getSkoda.

Это из console.log:

data: {
      filters: [Array],
      skoda: [Array],
      toyota: null,
      _version: 'Fri Jun 19 14:47:09 EEST 2020',
      errorCode: 'no_error'
    }

Есть еще помощь?

1 Ответ

1 голос
/ 19 июня 2020

В ответ вы должны получить два значения:

return axios
.all([getSkoda(), getToyota()])
.then((responseOne, responseTwo) => {
  console.log('responseOne', responseOne);
  console.log('responseOne', responseOne);

Вот пример кода, который может помочь в дальнейшем:

axios.all([getToyota(), getSkoda()])
  .then(axios.spread(function (toyotaResponse, skodaResponse) {
    // Both requests are now complete
  console.log('toyota Response', toyotaResponse);
  console.log('skoda Response', skodaResponse);
  }))

;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...