(Javascript的Node.js)如何从一个IIFE获得varibles

请参阅我的代码如下:我想分配logging集到一个variables,可以使用index.js来调用这个variables。

我能够console.loglogging集。 但是当我叫这个IIFE时,总是说未定义的。

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); }); 

但是,我无法获得logging集。 我得到了“你的结果是{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); 

我不明白你为什么需要IIFE,为什么不把这个函数分配给variables呢?

  • 如果你想把variables“recordset”赋值给“存储”,那么这将不会工作,因为“connection.connect”是一个asynchronous函数,在这种情况下,你应该考虑callback函数或promise。

更新

根据你的要求,这里有一个callback函数的实现以及它的使用方法

 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) // -------------------------------------------------- 

这段代码如何工作:
– 您首先调用storage方法并发送一个callback方法。
– callback函数的要点是你不会等待结果 ,你的代码会在存储方法连接到数据库并试图获取数据的同时继续工作。第(4)行将在第(3)行之前执行。
– 工作stream程如下:

  • (1)
  • (2)
  • (4)
  • (3)在将来的某个时候从数据库中检索数据
  • – 为了更清楚地看到这一点,请在最后一行尝试这样做,

     setTimeout(function(){console.log(answer);}, 3000); 

    这将等待一段时间,直到数据回来;