Promise.then () и Promise.catch () не работает в программе узла - PullRequest
0 голосов
/ 03 декабря 2018

Я пытаюсь отобразить живой поток, который читается opencv4nodejs и обрабатывается модулем распознавания лиц.Здесь проблема в том, что promise.then () не работает.даже не catch () при соответствующем условии. (я новичок в узле и обещаниях.) ожидаемый рабочий процесс:

чтение кадра с веб-камеры (по cv.read) -> сохранение в буфер (по cv.imwrite) -> чтение кадра из буфера (по fr.loadImage) -> процесс (по детектору.locateFaces) -> отображение -> повторение процесса.

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
*/

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018
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');

изменения: 1) удалить цикл while из eventEmitter.emit('read','abcd'); 2) рекурсивно выдать событие в promise.then() Я заметил, что при генерации события непрерывно не работает promise.then (), поэтому я генерирую событие в promise.then ()так что теперь он работает хорошо.

0 голосов
/ 06 декабря 2018

Поскольку вы используете eventEmitter, ваш код должен выглядеть следующим образом:

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

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();
        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');
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...