有没有办法在两个javascript节点运行之间共享和编辑全局变量?
主功能文件main.js具有:有没有办法在两个javascript节点运行之间共享和编辑全局变量?,javascript,node.js,Javascript,Node.js,主功能文件main.js具有: var nLastPingTime = 0, nLastPingNumber = 0; module.exports = { compareData: function(nPingTime, nLastPingNumber){ nLastPingTime = nPingTime; nLastPingNumber = nLastPingNumber; } }; 现在,另外两个文件
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
希望有帮助 因此,为了避免将这些变量存储在某个地方的复杂性,可以合并流程,但要重新组织代码,使其更易于导航
- 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
希望有帮助 亚当·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