0

我在 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()的是定期查找 afile.key以读取(如果存在),然后等到下一次调用以处理其内容。所以,console.log()不打算在阅读后立即使用,file.key而是在下一次checkAccess()被调用并随后调用。这就是为什么console.log()没有放在回调中的原因。

4

1 回答 1

4

那是异步编程。console.log(this.rawData)在进程完成之前调用fs.readFile(因为它是一个回调函数),不给你任何输出。把console.log()里面的fs.readFile-block ,你会看到你想要的输出。

看看异步库。如果您在流程完成后需要响应,请使用 async-series 或 async-waterfall。

于 2012-10-17T22:00:08.190 回答