【问题标题】:how to resolve the async await issue in javascript?如何解决javascript中的异步等待问题?
【发布时间】:2020-03-13 15:23:31
【问题描述】:

以下是我的代码

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> } ]

【问题讨论】:

  • 你能不能给你的代码加个sn-p,这比图片更好,也有助于解决你的问题。
  • 我有添加请检查
  • Promise{} 表示您必须使用 .then() 来检查该值。使用类似const returnFromAwait = await icsFileData(); 然后尝试returnFromAwait.then(res =&gt; console.log(res));
  • 不工作我试过这个
  • Promise {: undefined} proto: Promise [[PromiseStatus]]: "resolved" 得到这样的东西? [[PromiseValue]]: 未定义

标签: javascript node.js async-await es6-promise


【解决方案1】:

要理解的事情,

  1. async/await 只是编写异步代码的语法糖 同步时尚
  2. .map(async() =&gt; { ...}) 中的回调将返回一个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);

【讨论】:

    猜你喜欢
    • 2019-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-17
    • 2018-03-01
    • 1970-01-01
    • 2021-10-11
    相关资源
    最近更新 更多