使用 IMAP 和 javascript 获取电子邮件和附件时如何处理多个异步函数

问题描述 投票:0回答:1

我正在使用 IMAP 库和 javascript 来获取电子邮件。

我的计划如下:

  1. 按电子邮件、主题和时间范围获取电子邮件。
  2. 查找电子邮件号码。
  3. 对于每封电子邮件,我需要查找包含 PDF 文件的附件。
  4. 对于每个附件,我需要构建一个对象,将其推入数组内并将其发送到前端仅当函数结束时。如果我发送一个空数组也没关系



我现在遇到的问题
目前,我向特定电子邮件发送了两封电子邮件,其中包含相同的 pdf 和相同的主题。

  1. 不是在数组内接收两个对象,有时我收到一个,有时我收到空数组......但从来没有像我需要的两个对象......



我尝试了什么

  1. 定义了 imap 搜索函数,之前初始化了一个空数组,我需要在完成获取后发送对象。
  2. 从上面定义的 fetch 函数创建了一个流。提取获取了一个消息参数,同样是一个流。

  3. 执行简单的解析器功能,并为每个带有附件的已解析文档创建一个将发送到前端的对象。

代码

fetch.on('message', (msg) => { msg.on('body', (stream) => { simpleParser(stream, async (err, parsed) => { if (err) throw err; if (parsed.attachments) { //defined already as an empty array attachmentPromises = parsed.attachments.map(async (attachment, index) => { return new Promise((resolve, reject) => { if (attachment.contentType === 'application/pdf') { // Process the pdf here... resolve({ object details with key value pairs. }); } else { resolve(null); } }); }); //We wait for the promises to resolve Promise.all(attachmentPromises).then(attachments => { //we get only the values that are not null const validAttachments = attachments.filter(attachment => attachment !== null); allAttachmentsData = allAttachmentsData.concat(validAttachments); }); } }); }); });

获取事件

fetch.once('error', (err) => { console.log('Fetch error: ' + err); }); fetch.once('end', function () { //allAttachmentsData is empty return res.status(200).json(allAttachmentsData); })
    
javascript node.js asynchronous imap
1个回答
0
投票

您的方法建议您在事件侦听器内使用异步操作(simpleParser

和承诺处理)来获取消息。但是,您似乎无法确保在触发提取的结束事件之前完成所有异步操作。这可能会导致计时问题,即在所有承诺解决之前触发结束事件。

Promise.all

 函数用于处理 Promise 数组。但是,在您的代码中,使用 
Promise.all
 处理这些承诺是在 body 事件内完成的,这可能不会在 fetch 操作的结束事件之前解决。

const attachmentPromises = []; fetch.on('message', (msg) => { msg.on('body', (stream) => { const promise = new Promise((resolve, reject) => { simpleParser(stream, (err, parsed) => { if (err) return reject(err); if (parsed.attachments) { const promises = parsed.attachments.map((attachment) => { if (attachment.contentType === 'application/pdf') { // Process the pdf here... return { // Object details with key-value pairs }; } else { return null; } }); resolve(promises.filter(att => att !== null)); } else { resolve([]); } }); }); attachmentPromises.push(promise); }); }); fetch.once('error', (err) => { console.log('Fetch error: ' + err); res.status(500).json({ error: 'Fetch error' }); }); fetch.once('end', () => { Promise.all(attachmentPromises).then(results => { const attachments = results.flat(); res.status(200).json(attachments); }).catch(err => { console.log('Error resolving promises:', err); res.status(500).json({ error: 'Error processing emails' }); }); });
    
© www.soinside.com 2019 - 2024. All rights reserved.