我的程序中有一个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
}
});
setTimeout(function(){
console.log("pause");
},3000);
console.log(intervalo_final); //result not correct
return intervalo_final;
}
exports.gestion = gestion;
我知道节点执行我的返回而不等待我的函数结束,为此我看不到正确的结果,但是如何强制我的程序等待我的函数结束? 我尝试使用setTimeout函数但不是正确的方法。
答案 0 :(得分:1)
您必须像API中的其他异步函数一样实现您的功能! 第一步:给函数回调
var gestion = function(myJSON,vector_intervalo, callback) {
第二步:当异步进程过度调用回调传递结果时(你不需要返回行)
console.log(intervalo_final); //here I can see...
callback(intervalo_final);
第三步:以异步方式使用你的功能
gestionar.gestion(myJSONClient,vector_intervalo, function(result){
console.log(result);
});
答案 1 :(得分:0)
在async JS中,您无法按照您尝试的方式返回值。调用gestionar.gestion()时,需要从主程序传递回调函数(可以将其作为第三个参数添加)。
您的代码示例将无效,因为在设置intervalo_final内容之前,函数gestion()会立即返回。
这样的事情:
gestionar.gestion(myJSONClient,vector_intervalo, function callback(intervalo) {
// This is the callback function
console.log("intervalo: " + intervalo);
});
然后在函数中:
var gestion = function(myJSON,vector_intervalo, callback) {
...
db.clientes.save(cliente1, function(err, saveCliente) {
if (err || !saveCliente) {
console.log("Client "+cliente1.nombre+" not saved Error: "+err);
if (callback) callback(); // execute callback function without arguments
}
else {
console.log("Client "+saveCliente.nombre+" saved");
intervalo_final = calculate(vector_intervalo);
console.log(intervalo_final);
if (callback) callback(intervalo_final); // your callback function will be executed with intervalo_final as argument
}
});
另外,我强烈建议您阅读一些异步javascript教程,例如http://javascriptissexy.com/understand-javascript-callback-functions-and-use-them/
和菲利克斯的Node.js指南:http://nodeguide.com/