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

标签 javascript node.js

我制作了一个 Node 网络应用程序并且它可以工作。但是,我将其构建为整体,并且我尝试将其分解为模块以进行练习。

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

在我的整体版本中:

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 作为模块本身的变量。如果是返回,我只需根据函数的返回在主应用程序中定义一个变量。但由于该函数通过回调而不是返回获取数据,那么将该数据返回到主应用程序并可用于 app.get 函数的“正确”方法是什么?是在构建时,还是在 50 个函数运行完成后?

最佳答案

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

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

显然,我省略了一些步骤,例如一些 require 语句等,但希望您能理解。

总而言之,通常您希望避免这样的全局变量。特别是,如果您的应用程序必须扩展到多个进程(应用程序的每个实例将单独获取,并且可能最终会出现不同的状态),那么在内存中存储可能会发生变化的内容将导致稍后出现错误。

关于javascript - 在 Node.js 中,如何存储主应用程序中模块函数的回调数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47595770/

相关文章:

javascript - 我们可以禁止点击任何窗口吗?

node.js - 使用 docker 容器的 mongodb Node 应用程序最适合什么?

javascript - nightmare.js 如何实现类似window.callPhantom() 函数的功能?

javascript - Amazon Cloud (AWS) 中的代码-测试-代码周期

javascript - 如何在另一个函数中使用函数变量值?

javascript - Jquery检测具有相同ID的多个输入中的按键

javascript - 侧边栏子菜单元素未按应有的方式显示/隐藏

javascript - 为什么我不能用 Javascript 写 [1,2,3].reduce(Math.max)?

javascript - 使用 Node JS 调度应用程序

node.js - 是否可以使用 Cheerio 抓取 React 网站(Instagram)?