(Javascript Node.js)如何从IIFE中获取变量
请参阅下面我的代码: 我试图将记录集分配给一个变量,可以使用index.js调用这个变量 我能够对记录集进行console.log操作。但当我称之为生活时,它总是说没有定义(Javascript Node.js)如何从IIFE中获取变量,javascript,sql-server,node.js,Javascript,Sql Server,Node.js,请参阅下面我的代码: 我试图将记录集分配给一个变量,可以使用index.js调用这个变量 我能够对记录集进行console.log操作。但当我称之为生活时,它总是说没有定义 var mssql = require('mssql'); var dbcon = require('./dbcon'); var storage = (function () { var connection = new mssql.Connection(dbcon); var request = new ms
var mssql = require('mssql');
var dbcon = require('./dbcon');
var storage = (function () {
var connection = new mssql.Connection(dbcon);
var request = new mssql.Request(connection);
connection.connect(function (recordset) {
request.query('select getdate()', function (err, recordset) {
console.dir(recordset);
});
connection.close();
});
})();
module.exports = storage;
index.js
var storage = require('./storage');
"AMAZON.HelpIntent": function (intent, session, response) {
storage(function (recordset){
var speechOutput = 'Your result is '+recordset;
response.ask(speechOutput);
});
但是,我无法获取记录集。我得到“您的结果是{object,object}”。这是因为IIFE正在立即执行,请尝试返回一个函数,然后在导入该模块时执行该函数
var storage = (function(mssql, dbcon) {
return function() {
var connection = new mssql.Connection(dbcon);
var request = new mssql.Request(connection);
connection.connect(function(recordset) {
request.query('select getdate()', function(err, recordset) {
console.dir(recordset);
});
connection.close();
});
}
})(mssql, dbcon);
我不明白你为什么需要生命,为什么不把函数赋值给变量
- 如果您试图将变量“recordset”分配给“storage”,那么这将永远不会起作用,因为“connection.connect”是一个异步函数,在这种情况下,您应该考虑回调函数或承诺
var mssql = require('mssql');
var dbcon = require('./dbcon');
var storage = function(callback) {
var connection = new mssql.Connection(dbcon);
var request = new mssql.Request(connection);
connection.connect(function(recordset) {
request.query('select getdate()', function(err, recordset) {
if(!err && callback){
callback(recordset);
}
connection.close();
});
});
}
module.exports = storage;
// --------------------------------------------------
// implementation in another module
var storage = require("module_path"); // (1)
var answer;
storage(function(recordset){ // (2)
answer = recordset;
console.log(answer); // actual data, (3)
// implement your logic here
});
console.log(answer); // undefined (4)
// --------------------------------------------------
此代码的工作原理:-首先调用
存储
方法并向其发送回调方法。-回调函数的全部意义在于,您不会等待结果,您的代码实际上会在存储方法连接到数据库并尝试获取数据的同时继续工作,因为db操作要慢得多,所以第(4)行将在第(3)行之前执行。
-工作流程如下:
-为了看得更清楚,试着在最后一行这样做
setTimeout(function(){console.log(answer);}, 3000);
这将等待一段时间,直到数据返回 IIFE没有
return
语句,因此是的,它将返回undefined
。我怀疑您真正的问题是希望同步查看记录集-但是值是异步获取的-请参阅我理解我需要放置return语句。但不管我把它放在哪里。它仍然显示出意外。非常感谢您的回答。我正在尝试开发一个可以由Lambda运行的节点js。我正试图让程序将查询发送到AWS数据库并得到回复。你有什么建议吗?请根据我的代码提供一个回调函数示例好吗?谢谢你@冲然浩,我在我的index.js文件中的answerEI Temsahi中为您添加了一些代码。如果我使用console.log(记录集),它就会出现。然而,如果我使用var answer=recordset,那么console.log(answer),如果仍然显示未定义。请提出建议。你是如何使用它的,你能告诉我你在哪里分配答案和你在哪里操作吗?日志?EI Temsahi更新了原来的问题。请参阅index.js。