获取承诺的数组值
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"
})));
}
我正在尝试使用 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"
})));
}