我有一个需要返回值的函数。该值存在于downloadOrders函数内部的回调函数中。问题是在“关闭”(登录post request
之前打印了“执行”(登录downloadOrders
)。因此,我无法返回encodingPdf值。我该怎么办?
app.post('/api/***', async (req, res) => {
try {
const result = await orderServices.downloadOrders(data);
console.log("go")
if(result){
res.status(200).send(JSON.stringify(result));
} else {
res.status(400).send({err: 'Error creating PDF document.'});
}
} catch(err){
}
});
async downloadOrders(data){
try {
let documents = ["sample.pdf"];
const pdfStream = pdfmerger(documents);
var writeStream = fs.createWriteStream('merged-pdf.pdf');
pdfStream.pipe(writeStream);
pdfmerger(documents, 'merged-pdf.pdf');
pdfStream.on('close', function(code){
console.log("close")
let encodedPdf = base64.base64Encode('merged-pdf.pdf');
return encodedPdf;
});
} catch(err){
console.log(err)
return false;
}
}
答案 0 :(得分:1)
将close
事件包装在Promise
中,以便您等待它。
await new Promise((resolve, reject) => {
pdfStream
.on('error', reject)
.on('close', function(code){
let encodedPdf = base64.base64Encode('merged-pdf.pdf');
resolve(encodedPdf);
});
});
答案 1 :(得分:0)
您也可以将downloadOrders函数包装在promise中。
app.post('/api/***', (req, res) => {
orderServices.downloadOrders(data).then((result)=> {
console.log("go")
if(result){
res.status(200).send(JSON.stringify(result));
} else {
res.status(400).send({err: 'Error creating PDF document.'});
}
}).catch(err => {
res.status(500).send({err: 'Internal Server Error.'});
});
});
const downloadOrders = function(data){
return new Promise((resolve, reject) => {
try {
let documents = ["sample.pdf"];
const pdfStream = pdfmerger(documents);
var writeStream = fs.createWriteStream('merged-pdf.pdf');
pdfStream.pipe(writeStream);
pdfmerger(documents, 'merged-pdf.pdf');
pdfStream.on('close', function(code){
console.log("close")
let encodedPdf = base64.base64Encode('merged-pdf.pdf');
resolve(encodedPdf);
});
} catch(err){
reject(err);
}
});
}