2013-06-21 4 views
0

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

У меня есть главная в 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; 

ответ

2

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

Прежде всего, Вы не являетесь, выполняете блокирующие операции в узле. Фактически, сеть в узле полностью асинхронна.

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

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

Что касается состояния ожидания вашего сценария, то это никогда не заканчивается, вы должны взглянуть на this question. Есть ответ.