我想在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);
}
}
我如何使用回调方法来解决这个问题。
答案 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");