Search code examples
javascriptnode.jsopencveventses6-promise

promise.then() and promise.catch() not working in node program


I am trying to display a live stream which is read by opencv4nodejs and processed by face-recognition module. Here problem is, promise.then() is not working. not even catch() on the corresponding condition.(i am new at node and promises.) expected workflow:

read frame from webcam(by cv.read) -> save to buffer(by cv.imwrite) -> read frame from buffer(by fr.loadImage) -> process(by detector.locateFaces) -> display -> repeat process.

const fr = require('face-recognition');
const cv = require('opencv4nodejs');
const events = require('events');

const detector = fr.FaceDetector()
const cap = new cv.VideoCapture(0);
const win = new fr.ImageWindow()
const eventEmitter = new events.EventEmitter();

function process(){
    console.log('process');
    return new Promise(function(resolve,reject){
        console.log('promise');
        var frame = cap.read();
        cv.imwrite(`${__dirname}/buffer/img.jpg`, frame);
        if(frame != null)
            resolve('resolve');
        else
            reject('Problem While reading');
    });
}
eventEmitter.on('read',function(string){
    console.log('event call');
    var promise = process();
    promise.then(function(string){
        console.log(string);
        const image = fr.loadImage(`${__dirname}/buffer/img.jpg`);
        const faceRectangles = detector.locateFaces(image);
        win.setImage(image);
        fr.hitEnterToContinue();
    }).catch(function(err){
        console.log(err);
    });
});
while(true){
    console.log('emit');
    eventEmitter.emit('read','abcd');
}
/*****expected output should be*****
emit
event call
process
promise
resolve
/*****getting output*****
emit
event call
process
promise
*/

Solution

  • const fr = require('face-recognition');
    const cv = require('opencv4nodejs');
    const events = require('events');
    
    const detector = fr.FaceDetector()
    const cap = new cv.VideoCapture(0);
    const win = new fr.ImageWindow()
    const eventEmitter = new events.EventEmitter();
    
    function process(){
        console.log('process');
        return new Promise(function(resolve,reject){
            console.log('promise');
            var frame = cap.read();
            cv.imwrite(`${__dirname}/buffer/img.jpg`, frame);
            if(frame != null)
                resolve('resolve');
            else
                reject('Problem While reading');
        });
    }
    eventEmitter.on('read',function(string){
        console.log('event call');
        var promise = process();
        console.log(promise);
        promise.then(function(string){
            console.log(string);
            const image = fr.loadImage(`${__dirname}/buffer/img.jpg`);
            const faceRectangles = detector.locateFaces(image);
            console.log(faceRectangles);
            win.setImage(image);
            // fr.hitEnterToContinue();
            eventEmitter.emit('read','abcd');
        }).catch(function(err){
            console.log(err);
        });
    });
    eventEmitter.emit('read','abcd');
    

    changes: 1)remove while loop from eventEmitter.emit('read','abcd'); 2)recursively emit event in promise.then() I observed that while emitting event continuously promise.then() not working so i emit event in promise.then() so now its working nicely.