有没有办法在两个javascript节点运行之间共享和编辑全局变量?

时间:2018-06-15 17:51:46

标签: javascript node.js

main函数文件main.js包含:

var nLastPingTime = 0,
    nLastPingNumber = 0;

    module.exports = {

      compareData: function(nPingTime, nLastPingNumber){
        nLastPingTime = nPingTime;
        nLastPingNumber = nLastPingNumber;
      }

    };

现在另外两个文件dataGenOne.js和dataGenTwo.js看起来像这样:

const mainDataHolder = require('./main.js');

//Gets data from some API's here

mainDataHolder.compareData(nPingTime, nLastPingNumber);

然后开始我们运行:

node dataGenOne.js

node dataGenTwo.js

问题是main.js文件在两组数据之间不共享nLastPingTime和nLastPingNumber。

例如,当查看nLastPingNumber时,它的数字来自dataGenOne.js,而不是来自dataGenTwo.js(或反之亦然)。

我相信这是因为它们在两个不同的线程上运行。

无论如何要实现我想要做的事情?替代方案可以是连接数据库或写入文件,但如果可能的话,我宁愿不这样做。

3 个答案:

答案 0 :(得分:1)

为了实现你想要做的事情,让两个节点进程进行通信,你将拥有创建进程,让我们调用它生成,产生两个进程(让他们称之为p1和p2)然后处理p1和amp;之间的通信P2

因此,spawn将是一个非常简单的过程,只需为p1和amp; p2然后将这些事件转发给另一个进程。我没有这方面的工作示例,但是如果你看一下here,你应该能够很快地把它拼凑起来。

答案 1 :(得分:1)

亚当·H(Adam H)正确地指示了我。实际上,正确的方法是child_processes。

下面是代码更改:

主要功能文件main.js现在具有:

var cp = require('child_process');
var childDataOne = cp.fork('./dataGenOne.js', [process.argv[2]], { silent: true });
var childDataTwo = cp.fork('./dataGenTwo.js', [process.argv[3]], { silent: true });

childDataOne.stdout.on('data', function(data) {
    console.log('parent: ' + data);
    compareData(data);
    //Here is where the output goes
});

childDataTwo.stdout.on('data', function(data) {
    console.log('parent: ' + data);
    compareData(data);
    //Here is where the output goes
});

现在另外两个文件dataGenOne.js和dataGenTwo.js更改为如下内容:

process.stdin.resume();
var passingString = nPingTime + "," + nLastPingNumber;
process.stdout.write(passingString);

要开始运行,我们只需要做:

node main.js param1 param2

代替单独运行dataGenOne.js和dataGenTwo.js。

这正确地允许子进程将数据传递回父进程。 main.js正在使用stdout.on进行侦听,而两个dataGen子进程正在通过stdout.write传递数据。

答案 2 :(得分:0)

为了避免在某处存储这些变量的复杂性,请合并进程,但重新组织代码以便于导航。

  • main.js(比较函数?) - 从顶部删除变量,但要确保compare函数返回最新的ping值以及比较数据,即

     return { 
         data, 
         lastPingTime, 
         lastPingNumber 
     }
    
  • 将api内容移动到单独的文件中,以便您可以执行此操作

     var dataSetOne = require('./dataOne');
     var dataSetTwo = require('./dataTwo');
     var datasets = [dataSetOne, DataSetTwo];
    
     // initialize the values
     var lastPingTime = 0;
     var lastPingNumber = 0;
    
     // loop through the datasets
     for (var i = 0, len = datasets.length; i < len; i++) {
          let currentDataSet = datasets[i];
          const results = comparePrices(lastPingTime, lastPingumber, aAsks, aBids);
          // update the ping info here
          lastPingTime = results.lastPingTime;
          lastPingNumber = results.lastPingNumber;
     }
    

如果您有很多数据集,请制作一个&#39; index.js&#39;执行所有这些操作的文件,只返回数据集数组。

希望有所帮助!

相关问题