Javascript 我能';t更新Node.js中readFile()回调中的对象属性
Node.js中有下一个对象:Javascript 我能';t更新Node.js中readFile()回调中的对象属性,javascript,node.js,callback,Javascript,Node.js,Callback,Node.js中有下一个对象: function myObject(){ this.allowed = false; this.rawData; } myObject.prototype.checkAccess = function(){ var self = this; if (!this.allowed){ fs.readFile("./file.key", function(err, data){ if (err
function myObject(){
this.allowed = false;
this.rawData;
}
myObject.prototype.checkAccess = function(){
var self = this;
if (!this.allowed){
fs.readFile("./file.key", function(err, data){
if (err) return;
self.rawData = data;
self.allowed = true;
})
return;
}
// several operations with rawData
// not intended to be called when file.key is read
// but next time checkAccess is called, by example
console.log(this.rawData);
// or, by example, use its content to decrypt
// another file or data from a socket...
var isCorrectlyDecrypted = this.decrypt(this.rawData);
if (!isCorrectlyDecrypted) this.allowed = false;
}
我定期使用setInterval调用checkAccess,但我发现,在现有的file.key中,我从未更新过rawData属性,始终未定义,而允许的属性更新成功
请有人解释一下发生了什么,告诉我我做错了什么,最好的方法是什么
编辑:
正如我所说,在使用此类的代码中,我有:
var myObjectInstance = new myObject();
setInterval(function(){
// here some previous code
myObjectInstance.checkAccess();
// and here more code
}, 25)
checkAccess()
所做的是定期查找要读取的文件.key
,然后等待下一次调用处理其内容。因此,console.log()
不打算在读取file.key
后立即使用,但下一次调用checkAccess()
。这就是为什么console.log()console.log(this.rawData)
在fs.readFile
过程完成之前被调用(因为它是一个回调函数),不给您任何输出。将console.log()
放入fs.readFile
-块中,您将看到所需的输出
看一看这张照片。如果在流程完成后需要响应,请使用异步系列或异步瀑布。这是异步编程console.log(this.rawData)
在fs.readFile
过程完成之前被调用(因为它是一个回调函数),不给您任何输出。将console.log()
放入fs.readFile
-块中,您将看到所需的输出
看一看这张照片。如果流程完成后需要响应,请使用异步系列或异步瀑布。何时检查rawData
和allowed
的值?何时检查rawData
和allowed
的值?实际上,他在fs.readFile(…)
之后立即返回。因此,如果allowed==true
,它只会在后续调用checkAccess
时记录rawData
,即使它是self/this?有趣。当然,函数就是函数。他的工作流程有点奇怪。也就是说,我仍然认为您是对的,这是一个异步问题。正如Grampage所说,第一次我checkAccess
,console.log()
不执行,因为它不被允许,
,而是尝试读取file.key。该文件的存在决定下一个超时执行console.log()。如果我console.log()
就在self.rawData=data
之后,我可以看到控制台上打印的缓冲区…实际上他在fs.readFile(…)之后返回。因此,如果allowed==true
,它只会在后续调用checkAccess
时记录rawData
,即使它是self/this?有趣。当然,函数就是函数。他的工作流程有点奇怪。也就是说,我仍然认为您是对的,这是一个异步问题。正如Grampage所说,第一次我checkAccess
,console.log()
不执行,因为它不被允许,
,而是尝试读取file.key。该文件的存在决定下一个超时执行console.log()。如果我console.log()
就在self.rawData=data
之后,我可以看到控制台上打印的缓冲区。。。