在nodejs中维护变量的值

时间:2014-02-20 11:09:46

标签: node.js

我想在readFile()中初始化内容变量,并希望在nodejs的其他方法中使用此变量。在readFile()内部变量内部被初始化,但是在该变量的范围之外不存在。

fs = require('fs');   
var flag=0;  
var content="";

fs.readFile('./file.txt', function (err, data) {

if (err) {
    throw err; 
}
  console.log("file reading complete");
  content=data;   
  console.log("data:"+content);  
});

if(content=="")
   console.log("value not set");

编译完这段代码之后,我发现内容变量是在readFile()中初始化的,但它并没有将这个值保持到代码的末尾。我想在整个程序中维护这个内容变量的范围,我该如何完成这个任务。

我也尝试了回调方法样式,但是在运行这样的exec的情况下使用回调方法样式不起作用,

exec(cmd,function(error,stdout,stderr){

});

以下是一段代码,

var child = require('child_process');
var terminal = child.exec("java Temp");
var output="";

process.stdin.pipe(terminal.stdin);

terminal.stdin.on("end", function() {
 // process.exit(0);
});

terminal.stdout.on('data', function (data) { 
output+=data;
// console.log(''+data);  this line prints a=10 b=20
});

terminal.stderr.on('data', function (data) {
output+=data;
});


terminal.stdin.write('10 20');

console.log(""+output); // this line doesn't print any thing.

编译文件Temp的来源是

import java.io.*;
import java.util.Scanner;
class Temp
{
  public static void main(String[] args)
 {
    Scanner s=new Scanner(System.in);
    int a=s.nextInt();
    int b=s.nextInt();
    System.out.println("a="+a+"  b="+b);
 }
}

我如何使用回调方法来解决这个问题。

2 个答案:

答案 0 :(得分:4)

由于Node.js是异步的,因此执行最后一个if条件,而readFile()操作正在运行且内容仍为空。您需要添加一个回调,以便在readFile()操作完成后检查内容值。

您应该能够在程序中的任何位置获取内容变量的值,但在readFile()完成之前它将为空。

fs = require('fs');   
var flag=0;  
var content="";

fs.readFile('./file.txt', function (err, data) {
  if (err) {
    throw err; 
  }

  console.log("file reading complete");
  content=data;   
  check(); // CALLBACK HERE
  console.log("data:"+content);  
});

function check() {
  if(content=="")
     console.log("value not set");
  }
}

<强>更新

现在您已发布更多代码:

我不明白你的代码到底做了什么,但你犯的错误和初始问题一样。在和之前的console.log行执行,在任何值被附加到输出变量之前。

如果在此处输出输出变量

terminal.stdin.on("end", function() {
 console.log(''+output); // Output here
 // process.exit(0);
});

然后你应该得到所需的输出。

看一下下面的文章,它解释了Node.js中的异步模型。理解这一点对于编写适当的应用程序至关重要。 http://blog.shinetech.com/2011/08/26/asynchronous-code-design-with-node-js/

答案 1 :(得分:1)

您还可以使用fs.readFile的同步版本:

 var content = fs.readFileSync("filepath");