Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/404.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,下面的函数,startScript,包含需要一些时间才能运行的阻塞代码。在我的setInterval循环中,我想访问它返回的weight值。但是,当我运行这个节点程序时,我收到一个错误,说明new\u weight未定义 我尝试在循环中运行startScript.on('close',…),但这会抛出一个错误,说明startScripton没有方法 我做错了什么 var spawn = require('child_process').spawn var path = require('path

下面的函数,
startScript
,包含需要一些时间才能运行的阻塞代码。在我的
setInterval
循环中,我想访问它返回的
weight
值。但是,当我运行这个节点程序时,我收到一个错误,说明
new\u weight
未定义

我尝试在循环中运行
startScript.on('close',…)
,但这会抛出一个错误,说明
startScript
on没有方法

我做错了什么

var spawn = require('child_process').spawn
var path = require('path');
var split = require('split');
var pythonData = [];
var weight = null;

function startScript(){
  var pyScript = spawn('python', [ path.join(__dirname, 'script.py') ]);
  pyScript.stdout.on('data', function(lineChunk){
    pythonData = lineChunk.toString().replace(/[\S|\n|\[|\]]/,"").split(',');
  });

  pyScript.on('close', function(code){
    var sum = 0;
    for(var i=0; i < pythonData.length; i++){
      sum += parseFloat(pythonData[i]);
    }
    var weight = sum / pythonData.length;
    console.log("weight: " + weight);
    return weight;
  });
}

setInterval(function(){
  if (some event that occurs infrequently){
    startScript();
    var new_weight = weight + 100
    console.log(new_weight);
  }
}, 1000);
var spawn=require('child_process')。spawn
var path=require('path');
var split=需要(“拆分”);
var pythonda=[];
变量权重=空;
函数startScript(){
var pyScript=spawn('python',[path.join('script.py'));
pyScript.stdout.on('data',函数(lineChunk){
pythonda=lineChunk.toString().replace(/[\S |\n | \[| \]]/,“”)。split(“,”);
});
pyScript.on('close',函数(代码){
var总和=0;
for(var i=0;i
您不能从
pyScript.on()返回
,它是异步的。父函数早在另一个返回发生之前就已经返回了。相反,您必须使用回调

function startScript(callback){ // ******
  var pyScript = spawn('python', [ path.join(__dirname, 'script.py') ]);
  pyScript.stdout.on('data', function(lineChunk){
    pythonData = lineChunk.toString().replace(/[\S|\n|\[|\]]/,"").split(',');
  });

  pyScript.on('close', function(code){
    var sum = 0;
    for(var i=0; i < pythonData.length; i++){
      sum += parseFloat(pythonData[i]);
    }
    var weight = sum / pythonData.length;
    console.log("weight: " + weight);
    //return weight; // you can't return weight. Instead, execute the callback.
    callback(weight); // ******
  });
}

setInterval(function(){
  if (some event that occurs infrequently){
    startScript(function(weight){ // ******
      var new_weight = weight + 100
      console.log(new_weight);
    }); // ******
  }
}, 1000);
函数startScript(回调){//******
var pyScript=spawn('python',[path.join('script.py'));
pyScript.stdout.on('data',函数(lineChunk){
pythonda=lineChunk.toString().replace(/[\S |\n | \[| \]]/,“”)。split(“,”);
});
pyScript.on('close',函数(代码){
var总和=0;
for(var i=0;i
您从未定义过重量。而且你从来没有接受过开始脚本的返回值。我的意思是,这是最好的方式,但这个例子毫无意义。我假设您试图从大量代码中抽象出一个简单的想法。你有没有办法给我们真正的代码?好吧,你定义了权重,但你从来没有给它一个值。它仍然是
null
。如果
startScript
给出了
weight
一个值,那么您就可以按自己的方式访问它。我们需要看更多的startScript。如果startScript是异步的(考虑到您到目前为止所说的情况,我认为是异步的),那么它不能返回值,您必须使用回调。