Intentar exportar un valor creado por una función y al que solo se puede acceder mediante una devolución de llamada. No estoy seguro de cómo abordar esto.

require("lib").doThing("thing", function(value) {
    // need to get value to the top level in order to export it
});

module.exports = value;
0
rcjsdev 10 dic. 2015 a las 00:54

4 respuestas

La mejor respuesta

Envuelva eso en una función con una devolución de llamada, exporte toda la función:

function getValue(callback) {
    require("lib").doThing("thing", function(value) {
        // need to get value to the top level in order to export it
        callback(value);
    });
}

module.exports.getValue = getValue;

A continuación, llame a:

exportedVar.getValue(function(val) {
    console.log(val);
});
0
tymeJV 9 dic. 2015 a las 22:03

No está claro qué está tratando de hacer, pero siempre puede devolver un valor de una función anónima.

module.exports = require("lib").doThing("thing", function(value) {
    // need to get value to the top level in order to export it
    return value;
});
-1
Jason McKindly 9 dic. 2015 a las 22:00

No hay razón para llevarlo al nivel más alto. Simplemente expórtelo cuando tenga el valor dentro de la devolución de llamada o exporte una promesa en su lugar:

require("lib").doThing("thing", function(value) {
    // need to get value to the top level in order to export it
    module.exports = value;
});

Si la devolución de llamada anterior es asíncrona, entonces tendrá un problema de tiempo porque alguien que cargue su módulo no podrá obtener la propiedad con precisión hasta después de que la función asincrónica esté terminada y no sabrá cuándo es ese tiempo exacto.

Hay muchas formas de resolver eso, pero una forma ingeniosa es exportar una promesa en lugar del valor. La persona que llama puede llamar a .then() con la promesa de obtener el valor.

module.exports = new Promise(function(resolve) {
    require("lib").doThing("thing", function(value) {
        // need to get value to the top level in order to export it
        resolve(value);
    });
});

Entonces, la persona que llama de este módulo haría algo como esto:

require('someModule').then(function(value) {
    // process the value here
});
0
jfriend00 9 dic. 2015 a las 22:14

Si doThing es síncrono, esto funcionará:

require("lib").doThing("thing", function(value) {
    module.exports = value;
});

Si es asíncrono, tendrá que exportar un objeto y luego mutar una propiedad en el objeto cuando se active la devolución de llamada:

require("lib").doThing("thing", function(value) {
    module.exports.value = value;
});

module.exports = {};
0
Yuri Zarubin 9 dic. 2015 a las 22:02
34189735