Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/461.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有办法在两个javascript节点运行之间共享和编辑全局变量?_Javascript_Node.js - Fatal编程技术网

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

有没有办法在两个javascript节点运行之间共享和编辑全局变量?,javascript,node.js,Javascript,Node.js,主功能文件main.js具有: var nLastPingTime = 0, nLastPingNumber = 0; module.exports = { compareData: function(nPingTime, nLastPingNumber){ nLastPingTime = nPingTime; nLastPingNumber = nLastPingNumber; } }; 现在,另外两个文件

主功能文件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);
process.stdin.resume();
var passingString = nPingTime + "," + nLastPingNumber;
process.stdout.write(passingString);
然后开始运行:

node dataGenOne.js

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

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

我相信这是因为它们运行在两个独立的线程上


是否有任何方法可以实现我的目标?另一种方法可能是连接数据库或写入文件,但如果可能的话,我宁愿不这样做。

要实现您试图做的事情,让两个节点进程通信,您需要创建一个进程,让我们称之为spawn,它会生成两个进程(让我们称之为p1和p2)然后处理p1和p2之间的通信


因此,spawn将是一个非常简单的过程,它只需连接p1和p2的事件,然后将这些事件转发给另一个过程。我没有一个有效的例子,但如果你看一看,你应该能够很快地拼凑起来

要实现您想要做的事情,让两个节点进程通信,您需要创建一个进程,我们称之为spawn,它生成两个进程(我们称之为p1和p2),然后处理p1和p2之间的通信


因此,spawn将是一个非常简单的过程,它只需连接p1和p2的事件,然后将这些事件转发给另一个过程。我没有一个有效的例子,但如果你看一看,你应该能够很快地拼凑起来

因此,为了避免将这些变量存储在某个地方的复杂性,可以合并流程,但要重新组织代码,使其更易于导航

  • main.js(compare函数?)-从顶部删除变量,但确保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;
     }
    
    var-dataSetOne=require('./dataOne');
    var datasetwo=需要('./dataTwo');
    var数据集=[dataSetOne,DataSetwo];
    //初始化值
    var lastPingTime=0;
    var lastPingNumber=0;
    //循环遍历数据集
    对于(var i=0,len=datasets.length;i
如果您有很多数据集,那么创建一个“index.js”文件来满足所有这些要求,并只返回数据集数组


希望有帮助

因此,为了避免将这些变量存储在某个地方的复杂性,可以合并流程,但要重新组织代码,使其更易于导航

  • main.js(compare函数?)-从顶部删除变量,但确保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;
     }
    
    var-dataSetOne=require('./dataOne');
    var datasetwo=需要('./dataTwo');
    var数据集=[dataSetOne,DataSetwo];
    //初始化值
    var lastPingTime=0;
    var lastPingNumber=0;
    //循环遍历数据集
    对于(var i=0,len=datasets.length;i
如果您有很多数据集,那么创建一个“index.js”文件来满足所有这些要求,并只返回数据集数组


希望有帮助

亚当·H给我指出了正确的方向。正确的方法实际上是子进程

以下是代码更改:

主功能文件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更改为如下内容:

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

//Gets data from some API's here

mainDataHolder.compareData(nPingTime, nLastPingNumber);
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传递数据。

Adam H直接向我指出了正确的方向。正确的方法实际上是子进程

以下是代码更改:

主功能文件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更改为如下内容:

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

//Gets data from some API's here

mainDataHolder.compareData(nPingTime, nLastPingNumber);
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传递数据。

它们是独立的进程——除非它们有一种相互对话的方式,否则我看不出您的选项是什么。不管你写什么都是这样。做到这一点的“最佳”方式取决于你实际想要完成的事情。你到底想做什么?您希望通过共享数据实现什么?为什么不想通过其他数据共享渠道?请尽可能多地提供上下文。现在这听起来像是个XY问题。因为它们是独立的进程,所以有一些方法可以同步数据,但不能通过传统的JavaScript上下文,因为它们不共享上下文。基本上,它从两个不同的API(股票和加密)ping数据,然后比较main.js文件中的数据。所以我不希望他们在t