2017-07-06 95 views
0

我在node.js的一个真正的新手,所以请理解我可能愚蠢模块更新变量值

我试图用一个外部文件作为一个模块,这样我就可以用它其他文件。该项目是比这个大,但让我们说我的模块:

var Tools = module.exports = { 
    result_arr: [], 
    object_data: { 
    times : [], 
    temps1 : [], 
    temps2 : [], 
    temps3 : [], 
    temps4 : [], 
    levels : [], 
    flows : [] 
    }, 
    getLastNRows: function (whereIsData, DB_info, table, NRows) { 
    if (whereIsData == "MySQL") { 
     function setValue (value) { 
     Tools.result_arr = value; 
     } 
     function dataArray2Object (array_data) { 
     Tools.object_data.times = array_data.map(row => row.timestamp); 
     Tools.object_data.temps1 = array_data.map(row => row.temp1); 
     Tools.object_data.temps2 = array_data.map(row => row.temp2); 
     Tools.object_data.temps3 = array_data.map(row => row.temp3); 
     Tools.object_data.temps4 = array_data.map(row => row.temp4); 
     Tools.object_data.levels = array_data.map(row => row.level_ice_bank); 
     Tools.object_data.flows = array_data.map(row => row.flow); 
     } 
     var queryString = "SELECT timestamp, temp1, temp2, temp3, temp4, level_ice_bank, flow FROM " + 
         table + " ORDER BY id DESC LIMIT " + NRows + ";"; 
     var connnection = mysql.createConnection(DB_info); 
     connnection.connect(function(err) { 
     console.log("connected"); 
     if (err) throw err; 
     }); 
     connnection.query(queryString, function (err, rows) { 
     console.log("queried"); 
     if (err) throw err; 
     setValue(rows); 
     dataArray2Object(Tools.result_arr); 
     console.log(Tools.result_arr); 
     console.log(Tools.object_data); 
     }); 
    } 
    else { 
     console.log("Function only accepts data stored in MySQL.\n(u still have to improve...)"); 
     return; 
    } 
}; 

变量object_data应该在主文件中使用。这样,只要我拨打getLastNRows,我预计object_data将由getLastNRows中的操作更新。主要文件将是:

var tools = require('./tools'); 

var where2save = "MySQL"; 
var info_db = { 
    host : "127.0.0.1", 
    user : "root", 
    password: "xxxx", 
    database: "mydb", 
    port : 3306 
}; 
var table = "tempdata"; 
var NRows = 4; 

tools.getLastNRows(where2save, info_db, table, NRows); 

console.log(tools.object_data); 

所观察到的是,事实上,tools.object_data不受getLastNRows主文件更新,虽然console.log(Tools.object_data);从tools.js(模块)的文件将记录更新的值。所以我的问题是:

我怎样才能让getLastNRows更新tools.object_data主文件(里面是空的创建时)?

回答

0

getLastNRows异步吗?因为在我看来,这是问题的原因。

它要求在主,然后调用connection.query,它被放在一个工作线程getLastNRows然后立即继续到console.log其中tools.object_data尚未更新。

尝试:

getLastNRows: function (whereIsData, DB_info, table, NRows, cb) { 
    // ... 
    connnection.query(queryString, function (err, rows) { 
      console.log("queried"); 
      if (err) throw err; 
      setValue(rows); 
      dataArray2Object(Tools.result_arr); 
      console.log(Tools.result_arr); 
      console.log(Tools.object_data); 
      cb() 
    }); 
    // ... 
} 

// in main 
tools.getLastNRows(where2save, info_db, table, NRows, function() { 
    console.log(tools.object_data); 
}); 
+0

它可能是异步的(至少'connection.query()'是异步)。无论如何,在执行下一条代码行之前,要等待getLastNRows完成吗? – arocha

+0

我刚刚提供了一个应用程序代码片段的更新。您需要将回调传递给'getLastNRows'。如果您没有使用旧的节点版本,您可能需要查看'Promises'或'async/await'。 – RNikoopour

+0

非常感谢,您的代码正常工作!我知道你回答了我提出的问题,但这不完全是我真正需要的。我真正需要的是将'tools.object_data'存储在下一行使用的变量中(例如'var foo = tools.getLastNRows(where2save,info_db,table,NRows,function(){return tools.object_data;} );') 或 下一行代码刚刚在'tools.object_data'的值更新时执行。 你能帮助我吗? – arocha