0

I have a function being called which needs to return a value. The value exists inside a callback function inside of the downloadOrders function. The issue is "go" (log in post request) is printed before "close" (log in downloadOrders). So I'm not able to return the encodedPdf value. What do I need to do?

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
  • I don't see where "done" is being logged in your posted code. Commented Sep 7, 2018 at 15:59
  • @Jacob sorry I meant "close". I edited the question. Commented Sep 7, 2018 at 16:01

2 Answers 2

1

Wrap the close event in a Promise so you can await it.

await new Promise((resolve, reject) => {
  pdfStream
    .on('error', reject)
    .on('close', function(code){
      let encodedPdf = base64.base64Encode('merged-pdf.pdf');
      resolve(encodedPdf);
    });
});
Sign up to request clarification or add additional context in comments.

Comments

0

You can wrap the downloadOrders function in a promise too.

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.