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()対象の が存在する場合は定期的に検索しfile.key、次の呼び出しまで待ってその内容を処理するということです。SO は、console.log()が読み取られた直後に使用されることを意図していませんがfile.key、次回checkAccess()は呼び出され、その後に呼び出されます。そのためconsole.log()、 はコールバック内に配置されません。

4

1 に答える 1

4

それが非同期プログラミングです。console.log(this.rawData)プロセスが完了する前に呼び出されfs.readFile(コールバック関数であるため)、出力はありません。を -blockのconsole.log()中に入れるfs.readFileと、必要な出力が表示されます。

非同期ライブラリを見てください。プロセスの終了後に応答が必要な場合は、async-series または async-waterfall を使用してください。

于 2012-10-17T22:00:08.190 に答える