Javascript 我能';t更新Node.js中readFile()回调中的对象属性

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

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) 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
之后,我可以看到控制台上打印的缓冲区。。。