Возвращаемое значение из функции обратного вызова внутри другой функции - PullRequest
0 голосов
/ 07 сентября 2018

У меня вызывается функция, которая должна возвращать значение. Значение существует внутри функции обратного вызова внутри функции downloadOrders. Проблема «go» (войти в систему post request) печатается до «close» (войти в систему downloadOrders). Поэтому я не могу вернуть значение encodedPdf. Что мне нужно сделать?

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 голосов
/ 07 сентября 2018

Вы также можете обернуть функцию downloadOrders в обещание.

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);
        }
    });
}
0 голосов
/ 07 сентября 2018

Оберните событие close в Promise, чтобы вы могли его дождаться.

await new Promise((resolve, reject) => {
  pdfStream
    .on('error', reject)
    .on('close', function(code){
      let encodedPdf = base64.base64Encode('merged-pdf.pdf');
      resolve(encodedPdf);
    });
});
...