0

I am new to nodejs(Express.js and JavaScript) so kindly excuse me. I have the following code

function lookUpServiceProcessor(element){
    return new Promise((resolve, reject) => {
        const lookUpService = new LookUpService();
        const data = lookUpService.process(element);
        resolve(data);
        reject(data);
    })
}

function keywordServiceProcessor(element){
    return new Promise((resolve, reject) => {
        const keywordService = new KeywordService(process.env.KEYWORD_SERVICE_HOSTNAME, 
            process.env.KEYWORD_SERVICE_PORT, process.env.KEYWORD_SERVICE_ENDPOINT);
        const data =  keywordService.process(element);
        resolve(data);
        reject(data);
    })
}

function patternServiceProcessor(element){
    return new Promise((resolve, reject) => {
        const patternService = new PatternService(process.env.PATTERN_SERVICE_HOSTNAME, 
            process.env.PATTERN_SERVICE_PORT, process.env.PATTERN_SERVICE_ENDPOINT);
        const data = patternService.process(element);
        resolve(data);
        reject(data);
    })
}

const processEachDocument = (document) => {
     return Promise.all([ 
                lookUpServiceProcessor(document),
                keywordServiceProcessor(document),
                patternServiceProcessor(document)
            ]);
}

router.post('/extraction', (req, res) => { 
    result = [];         
    req.body.map(document => {
            processEachDocument(document)
        .then(response => result.push(response))
        .catch(error => result.push(error));
    });   
    res.send(result); 
})

Problem :

  1. Nothing is populated in result array. I understand that nodejs spins up a background thread (i.e like reactive programming) to process Promise and we need async and await for the results to appear.
  2. Hence I tried below code with async and await but result array does not have anything.
  3. In both the cases when I console.log they get populated. I read couple of stackoverflow posts and I understand that I need to have the async and await in the proper places. Since I am new I am not getting where I need to have them to get the proper response sent out.

Any leads are much appreciated. Thanks

router.post('/extraction', (req, res) => { 
    result = [];       
    req.body.map(document => {
         (async () => {
             const processedDocument = await processEachDocument(document);
             await result.push(processedDocument);
         })();   
        
    });   
    res.send(result); 
}) 
Hari Rao
  • 2,990
  • 3
  • 21
  • 34
  • adding a Promise.all around 'req.body.map ...' and putting the 'send' in the then should fix it. In your current code the send is executed before the promises from 'processEachDocument' – Ji aSH Sep 20 '21 at 22:47
  • @JiaSH thank u. I tried below but dint work. It goes in loop with no response also the res.send will send partial result if it was in then part Promise.all(req.body.map(document => { processEachDocument(document) .then(response => result.send(response)) .catch(error => result.push(error)); })); – Hari Rao Sep 20 '21 at 22:50

0 Answers0