从另一个函数内的回调函数返回值

时间:2018-09-07 15:56:49

标签: javascript node.js asynchronous callback async-await

我有一个需要返回值的函数。该值存在于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;
    }
}

2 个答案:

答案 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);
        }
    });
}