Нет блокирующей операции в MongoJS

Мне нужно выполнить операцию, которая что-то вычислит для меня, но я не могу использовать ее результат, потому что я всегда остаюсь в состоянии ожидания, фактически в моем терминале моя программа продолжает выполняться, пока я не нажму ctrl+C.

У меня есть main в nodejs для моей программы, где мне нужно использовать мой результат, рассчитанный в модуле.

var myJSONClient = {
    "nombre" : "<nombre_cliente>",
    "intervalo" : [0,0]
    };


var intervalo = gestionar.gestion(myJSONClient,vector_intervalo); 
console.log("intervalo: "+intervalo); //return undefined

А это модуль

var gestion = function(myJSON,vector_intervalo) { 
var dburl = 'localhost/mongoapp';
var collection = ['clientes'];
var db = require('mongojs').connect(dburl, collection );
var intervalo_final;

    function cliente(nombre, intervalo){
        this.nombre = nombre;
        this.intervalo = intervalo; 
    }

    var cliente1 = new cliente(myJSON.nombre,myJSON.intervalo);

    db.clientes.save(cliente1, function(err, saveCliente){
    if (err || !saveCliente) console.log("Client "+cliente1.nombre+" not saved Error: "+err);
    else console.log("Client "+saveCliente.nombre+" saved");
        intervalo_final = calculate(vector_intervalo);

        console.log(intervalo_final); //here I can see the right content of the variable intervalo_final

    });

console.log(intervalo_final); //this is not executed
return intervalo_final;
}

exports.gestion = gestion;

person user2369478    schedule 21.06.2013    source источник


Ответы (1)


Добро пожаловать в асинхронный мир! :)

Прежде всего, вы не выполняете блокирующие операции в Node. На самом деле сеть в Node полностью асинхронна.

Часть, которую вы указываете, console.log работает, потому что функция обратного вызова вызова db.clientes.save. Этот обратный вызов указывает, что ваше сохранение монго завершено.

Что означает асинхронная сеть?
Это означает, что ваше сохранение будет обработано когда-то в будущем. Скрипт не будет ждать ответа, чтобы продолжить выполнение кода. console.log сразу после вызова сохранения будет выполнено, как только оно будет достигнуто.

Что касается «состояния ожидания» вашего скрипта, который никогда не заканчивается, вам следует взглянуть на этот вопрос. Вот ответ.

person gustavohenke    schedule 21.06.2013