Как решить проблему asyn c в javascript? - PullRequest
0 голосов
/ 13 марта 2020

ниже мой код

let icsFileData = [];
icsFileData = filterAttachmentArray.map(async(file) => {
  let buff = new Buffer(file.data, 'base64');
  let text = buff.toString('ascii');
  const data = await ical.async.parseICS(text);
  const objectKeys = Object.values(data);
  const filterObj =
    objectKeys.length === 1 || objectKeys[0].type === 'VEVENT' ? objectKeys[0] : objectKeys[1];
  const desiredObj = {
    subject: filterObj.summary.val ? filterObj.summary.val : filterObj.summary,
    description: filterObj.description.val ? filterObj.description.val : filterObj.description,
    dateStart: moment(filterObj.start).format('YYYY-MM-DDTHH:mm:ss\\Z'),
    dateEnd: moment(filterObj.end).format('YYYY-MM-DDTHH:mm:ss\\Z'),
    organizer: filterObj.organizer.params.EMAIL ?
      filterObj.organizer.params.EMAIL :
      filterObj.organizer.val.split('mailto:').join(''),
    invites: filterObj.attendee.length === undefined ?
      filterObj.attendee.params.EMAIL ?
      filterObj.attendee.params.EMAIL :
      filterObj.attendee.val.split('mailto:').join('') :
      filterObj.attendee.map(
        (invite) =>
        invite.params.EMAIL ? invite.params.EMAIL : invite.val.split('mailto:').join('')
      ),
    location: filterObj.location.val ? filterObj.location.val : filterObj.location
  };
  icsFileData.push(desiredObj);
});
//const icsFileDataArray = await Promise.all(icsFileData);
console.log('jhgjhgjhgj: ', await icsFileData);

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

Вот результат, который мне всегда возвращает этот код

[ Promise { <pending> } ]

1 Ответ

2 голосов
/ 13 марта 2020

Что нужно понять,

  1. async/await - это всего лишь синтаксический сахар для асинхронного написания c кода синхронно
  2. обратного вызова внутри вашего .map(async() => { ...}), который будет возвращать Promise.
  3. , поэтому в вашем коде icsFileData является набором Promise, поэтому вы должны использовать Promise.all для разрешения всех обещаний, чтобы получить желаемый результат
let icsFileData = [];
icsFileData = filterAttachmentArray.map(async(file) => {
  ....
  // you dont need this line, you can simply return the desiredObj
  // icsFileData.push(desiredObj);
  return desiredObj;
});
// this does the magic, since, icsFileData is a array of Promise
const icsFileDataArray = await Promise.all(icsFileData);
console.log('result: ', icsFileDataArray);
...