如何在异步函数中使用“this”?

时间:2012-06-11 22:01:07

标签: node.js

我有一个简单的例子:

function File(name) {
   this.name = name
   this.text = null
}

File.prototype = {
    read: function() {
         fs.readFile(this.name, function (err, data) {
     }
    },
    getContent: function() {
         return this.text
     }
}

var myfile = new File('my_file')

watch.createMonitor('my_file_dir', function (monitor) {
    monitor.files['my_file']
    monitor.on("change", function (f, stat) {
        myfile.read()
    }
})

  main program....:

   myfile.getContent() ...

我想在this.text变量中添加文件内容。怎么做?

3 个答案:

答案 0 :(得分:5)

  • 创建局部变量并存储'this'

    读:function(){      var _file = this;      fs.readFile(this.name,function(err,data){         ...         _file.text = data;         ...      }); },

  • 将'this'绑定到内部函数: 读:function(){

     fs.readFile(this.name, function (err, data) {
         ...
         this.text = data;
         ...
     }.bind(this)
    

    },

注意: 将数据存储到this.text是不够的:如果您在yur类中异步读取某些内容,则需要提供回调以让其他对象知道您在yourFile.text中获得了一些数据

答案 1 :(得分:4)

您可以在闭包之外保存对this的引用,并从内部引用它:

File.prototype = {
    read: function() {
        var self = this;
        fs.readFile(this.name, function (err, data) {
            self.text = data;
        });
    },
    getContent: function() {
        return this.text
    }
}

答案 2 :(得分:0)

你可以做几件事:

  1. 创建this的范围版本:

    File.prototype = {
      read: function() {
        var self = this;
        fs.readFile(this.name, function (err, data) {
          self.text += data;
        });
      }
    };
    
  2. 将函数绑定到当前值this

    File.prototype = {
      read: function() {
        fs.readFile(this.name, function (err, data) {
          this.text += data;
        }.bind(this));
      }
    };