@mikaevnikita

Как задать контекст?

let fs = require('fs');

class Logger{
    constructor(fname){
        this.fname = fname;
        fs.open(fname, "a", function(err, file_handle) {
            if(!err)
                this.file_handle = file_handle;
            else
                console.error('Cant open file "'+fname+'".');
        });
    }
    log(level, data){
        const writen_data = level + ":" + data;
        fs.write(this.file_handle, writen_data, null, 'ascii', function(err, written) {
            if (err) {
                console.error('Cant write data: "' + data + '" to file: ' + this.fname);
            } else {
                console.log(writen_data);
            }
        });
    }
}


log = new Logger('log.txt');


Вываливается с ошибкой:
this.file_handle = file_handle;
                                 ^

TypeError: Cannot set property 'file_handle' of null

Трассировка говорит о том, что this == null.
Как переделать этот код чтобы все работало?
  • Вопрос задан
  • 137 просмотров
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
Замените обычную функцию на стрелочную:

fs.open(fname, 'a', (err, file_handle) => {
  if (!err)
    this.file_handle = file_handle;

Или bind используйте. Или можете до вызова fs.open сохранить текущий контекст в переменную, и использовать её внутри коллбека вместо this.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
28 нояб. 2024, в 18:46
3000 руб./за проект
28 нояб. 2024, в 17:46
10000 руб./за проект
28 нояб. 2024, в 17:38
12000 руб./за проект