在Node.js中,如何在主应用程序中存储模块函数的回调数据?

时间:2017-12-01 14:41:14

标签: javascript node.js

我制作了一个节点网络应用程序,它的工作原理。但是,我把它建成单片,我试图把它分解成模块进行练习。

很长的问题简短,在一个模块中,我如何从回调结果中定义变量并以主应用程序可用的方式存储它?它是否像将模块中的结果存储到全局变量并将其导出一样简单?

在我的monolthic版本中:

app.js

var resultsArray = [];
function getDatafromHTTP(page){
    callback(data){
        resultsArray.push(data);//push json elements to array
        if(page < 50){page++;getDatafromHTTP(page);}
    }
}
getDatafromHTTP(0);
app.get(some function that displays the resultsArray)

getDatafromHTTP函数通过页面变量运行50次。

现在我试图将其分解:

app.js

var resultsArray =[];
var getDatafromHTTP = require(module.js).getDatafromHTTP
getDatafromHTTP(0);
app.get(some function that displays the resultsArray)

module.js

exports.getDatafromHTTP = function(page){
    callback(data){
        resultsArray.push(data);//push json elements to array
        if(page < 50){page++;getDatafromHTTP(page);}
    }
}
//error resultsArray not Defined.

我明白为什么在模块中没有定义resultsArray,并且理解我可以将resultsArray作为模块本身的变量。如果它是一个返回,我只需根据函数的返回在主应用程序中定义一个变量。但是因为函数通过回调而不是返回来获取数据,所以&#34;对&#34;将数据恢复到主应用程序并可用于app.get函数的方法?无论是在构建时,还是在50个函数运行完成后?

2 个答案:

答案 0 :(得分:1)

有许多不同的方法可以做到这一点,但我见过的最常见的模式是将值添加为app(或类似)的新属性。例如:

module.exports = function(app) {
  return function getHttpData(callback) {
    request.get('http://example.com/', (err, results, body) => {
      if (err) return cb(err);
      app.httpData = body;
      return cb(null, body);
    });
  }
}

然后在您的通话代码中,您可以执行以下操作:

var app = express();
var getHttpData = require('./get-http-data.js')(app); // <-- note I'm passing the app object in here

// sometime later
getHttpData((err, data) => {
    console.log(data);
});

显然,我已经离开了一些像需要声明等等的步骤,但希望你能得到这个想法。

所有这一切,经常你想避免像这样的全局变量。特别是,如果您的应用程序必须扩展到多个进程(应用程序的每个实例将单独获取,并可能结束不同的状态),那么存储可能会在内存中更改的内容将导致以后的错误。

答案 1 :(得分:0)

module.js

function getDataFromHTTP() {
  return callback(data) {
    return data;
  }
}

module.exports = getDataFromHTTP;

app.js

var getDataFromHTTP = require('module.js');

var resultsArray = [];
for (var page=0; page<50; page++) {
  resultsArray.push(getDataFromHTTP);
}