Javascript, как положить xml2js в функцию

Я пытаюсь экспортировать функцию, которая будет анализировать XML для объекта JSON.

export const parse = (body) => {
  const parser = new xml2js.Parser({explicitArray: false, trim: true});
  parser.parseString(body, (err, result) => {
    if (err) return err;
    parser.parseString(result['soapenv:Envelope']['soapenv:Body']['ns1:searchResponse'].searchReturn._, (err, result) => {
      if (err) return err;
      console.log(result);
      return result;
    });
  });
}

Проблема, с которой я столкнулся, заключается в том, что функция возвращает неопределенное значение, однако ей удается в console.log получить правильный результат.

2 ответа

Поскольку ваша функция асинхронна, вы можете преобразовать ее в обещание.

export const parse = (body) => {

return new Promise((resolve, reject) => {

  const parser = new xml2js.Parser({explicitArray: false, trim: true});
  parser.parseString(body, (err, result) => {
    if (err) return reject(err);
    parser.parseString(result['soapenv:Envelope']['soapenv:Body']['ns1:searchResponse'].searchReturn._, (err, result) => {
      if (err) return reject(err);
      resolve(result);
    });
  });
  }


})

Вы можете использовать это таким образом..

const result = await parse(<somebody>)

Парсер асинхронный, поэтому вам необходимо учитывать это с помощью обратного вызова или обещания.

const parser = new xml2js.Parser({explicitArray: false, trim: true});

export const parse = (body) => new Promise((resolve, reject) => {

  parser.parseString(body, (err, result) => {
    if(err) return reject(err);

    return resolve(result);    
  });
});

Использование.

module.parse(xml).then((parsedResult) => {

});
Другие вопросы по тегам