获取承诺的数组值

Get the array value of a promise

我正在尝试使用 Sendgrid 发送多个附件,并带有如下新承诺。我想 return 一组对象,但我不知道该怎么做。 emailAttachments 包含我的 3 个对象,但我如何 return 数组?你能告诉我我的代码有什么问题吗?

const emailAttachments = []

return new Promise(function(resolve, reject){

    pdfList.map(item => {

        fs.readFile((item.frDoc), (err, data) => {
            if (err) {
              return { handled: false }
            }

            if (data) {
                
                emailAttachments.push({
                    content: data.toString('base64'),
                    filename: `document.pdf`,
                    type: 'application/pdf',
                    disposition: 'attachment'
                })

            }
        });
    })

    resolve(emailAttachments)
})

我想你需要这样的东西:

async function getEmailAttachments(pdfList) {
    const emailAttachments = await Promise.all(pdfList.map((item) => {
        return new Promise(function (resolve, reject) {
            fs.readFile((item.frDoc), (err, data) => {
                if (err) {
                    reject({ handled: false });
                }
                if (data) {
                    resolve({
                        content: data.toString('base64'),
                        filename: `document.pdf`,
                        type: 'application/pdf',
                        disposition: 'attachment'
                    });
                }
            });
        });
    }));
    return emailAttachments;
}

[编辑] 或使用 readFile 的承诺版本(@derpirscher 的建议):

async function getEmailAttachments(pdfList) {
    const emailAttachments = await Promise.all(pdfList.map(async (item) => {
        const data = await fs.promises.readFile(item.frDoc);
        return {
            content: data.toString('base64'),
            filename: `document.pdf`,
            type: 'application/pdf',
            disposition: 'attachment'
        };
    }));
    return emailAttachments;
}

您正在混合使用回调函数和承诺。那行不通的。我建议使用自节点 10 以来支持的 fs 模块的承诺 API。

此外,您需要在解析 promise 之前等待文件读取,而您目前没有这样做。

import { promises as fsp} from "fs"; //use the Promise API from fs

async function getAttachments(pdffiles) {
  return Promise.all(pdffiles.map(pdf => fsp.readFile(pdf.frDoc)))
    .then(files => files.map(f => ({
       content: f.toString("base64"),
       filename: "document.pdf",
       type: "application/pdf",
       disposition: "attachment"
     })));

}