No se pueden llamar funciones con Require.js

Intento escribir un módulo para mi servidor node.js con require.js que simplemente devuelve el objeto que quiero obtener de una URL. Pero de alguna manera no puedo devolver los valores que obtengo con mi método. El http.get … se realiza después de que devuelvo el valor, de modo que acabo de obtener “indefinido” pero ¿por qué?

¿Me podría ayudar? Lo siento si esa es una misión estúpida pero soy realmente nuevo en javascript node.js y require.js.

define(['http'], function(http){ console.log('Hi ich bin pullArchiveVolume'); var response = 1; console.log('Log 1: ' + response); http.get("http:...", function(res) { var body = ''; res.on('data', function(chunk) { body += chunk; }); res.on('end', function() { console.log("Log 2: " + response); response = 2; console.log("Log 3: " + response); response = JSON.parse(body); return response; // console.log("Log 2 :", response); // console.log("Got response: ", response); }); }).on('error', function(e) { console.log("Got error: " + e.message); }); console.log("Log 4: " + response); return response; }) 

Salida de consola:

 Hi ich bin pullArchiveVolume Log 1: 1 log 4: 1 log 2: 1 log 3: 2 

¡Gracias!

No puede tener una función que haga que una llamada asíncrona simplemente devuelva algo (a menos que sea una promesa ).

Necesita que su función tome un parámetro de callback:

 function foo(callback) { doSomethingAsync(function(data) { // fire callback, which is a function that takes an argument 'data' callback(data) }); } 

Entonces puedes usarlo así:

 foo(function(data) { doStuffWith(data); }); 

La razón por la que obtiene lo que obtiene es que http.get(...) solo inicia una operación de red. En algún momento indefinido en el futuro, se ejecutarán las devoluciones de llamada que le dio. Sin embargo, http.get(...) regresa de inmediato, antes de que se ejecuten las devoluciones de llamada. (Por lo tanto, es una operación asíncrona). Entonces, para cuando llegue a su statement de return , la operación de red aún no está completa y devolverá el valor inicial que le dio a su variable de response . Finalmente, la operación de la red se completa, se llama a su callback exitosa y luego se actualiza la response al valor que realmente deseaba.

Como han dicho otros, es necesario utilizar devoluciones de llamada o promesas. O repensar su diseño.