1

Desde archivo1.js estoy llamando mediante una promesa a otra que está en archivo2.js y necesito que me devuelva un json con resultados. El código de esos ficheros son:

archivo1.js

var imgHelper = require('../helpers/imgHelper');

imgHelper.transform(result).then(function(mergeResult) {
      return res.status(200).json(mergeResult);
});

archivo2.js

var OcrImgHelper = {

    transform: function(result) { 

        var objImgs = {};
        var fileName = result[0].fileName;
        var pageCount = result.length;
        var pageDataList = [];
        objImgs.fileName = fileName;
        objImgs.pageCount = pageCount;

        for (var i=0; i<result.length; i++) {
            var pageDataList_old = result[i].pageDataList; 
            objImgs.pageDataList.push(pageDataList_old);
        }

        return objImgs;
    },
};

No sé si hay algún error o me falta algo, pero cuando entra en la función transform no me devuelve el json que espero de vuelta. ¿Falta alguna promesa? Se queda esperando un resultado que no sé por qué no devuelve. En cambio la función por separado (transform), sin la llamada desde la promesa si que funciona...

¿Cómo puedo recibir resultados desde la promesa? necesito recoger de vuelta el json "objImgs"

module.exports = OcrImgHelper;
JackNavaRow
  • 6,836
  • 5
  • 22
  • 49
Norak
  • 790
  • 2
  • 12
  • 36

1 Answers1

2

No estas retornando una promesa, ni estas retornando un objeto con el metodo then. Lo que retornas el objeto objImgs que tiene las siguientes propiedades:

{
  pageName: string,
  pageCount : number,
  pageDataList : array
}

Por lo que al momento de acceder al metodo then te lanza un error porque no esta definido.

En tu caso te convendria mas un callback, no una promesa. Un callback es una funcion que le envias como parametro para que al terminar el merge, se ejecute.

En archivo2.js tendrias esto:

var OcrImgHelper = {

    transform: function(result, callback) { 

        var objImgs = {};
        var fileName = result[0].fileName;
        var pageCount = result.length;
        var pageDataList = [];
        objImgs.fileName = fileName;
        objImgs.pageCount = pageCount;

        for (var i=0; i<result.length; i++) {
            var pageDataList_old = result[i].pageDataList; 
            objImgs.pageDataList.push(pageDataList_old);
        }

        callback(objImgs);
    },
};

Entonces ahora solo tendiras que enviarle al funcion por parámetro para cuando termine el merge:

mgHelper.transform(result, function(mergeResult) {
      return res.status(200).json(mergeResult);
});

En caso de que necesites sabes que es una promesa a profundidad mira la pregunta ¿Qué es una promesa en Javascript?

Einer
  • 20,190
  • 2
  • 14
  • 36
  • @JackNavaRow Para eso están estas excelentes [pregunta y respuesta](https://es.stackoverflow.com/questions/64265/qu%C3%A9-es-una-promesa-en-javascript/64403) – Pablo Lozano Oct 31 '17 at 14:13
  • No veo ningún código asíncrono, entonces, ¿Porqué usar callbacks?, en lugar de una función `normal` que devuelva un valor. ¿Porqué aconsejas callbacks en lugar de promises? `return Promise.resolve(objImgs)` y `mgHelper.transform(...).then(...)`. – Jose Hermosilla Rodrigo Oct 31 '17 at 16:08
  • esta leyendo un archivo @JoseHermosillaRodrigo – JackNavaRow Nov 01 '17 at 01:17