Как вызвать функцию родительского класса внутри асинхронной функции - PullRequest
0 голосов
/ 17 сентября 2018

Мне нужно вызвать функцию pushBulkData внутри события чтения потока.

Я пробовал с

this.pushBulkData(row, importData);

Я знаю, что это не сработает, потому что у этого здесь есть отдельная область

и

taskController.pushBulkData(row, importData);

, и это невозможно сделать постоянно.

Будет ли bind работать?

class taskController{
    async import(path){

        var dest = fs.createWriteStream(path);

        src.pipe(dest);

        let importData = [];

        src.on('end', function() {
            fs.createReadStream(path)
            .pipe(require('csv-parser')(['name', 'status']))
            .on('data', function (row) {
                //this makes error
                this.pushBulkData(row, importData);
            })
            .on('end', function () {

                // We are done
            })
        });
        src.on('error', function(err) { console.log('error on upload file'); });
    }

    pushBulkData(row, importData){
        console.log('row', row);         

        importData.push(
            {
                name          : row.name,
                status        : row.status}
        );
    }
}
} 

Ответы [ 2 ]

0 голосов
/ 17 сентября 2018

Да, связывание будет работать здесь.но вы можете использовать функцию жирной стрелки, чтобы не потерять свой контекст.

src.on('end', () => {
    fs.createReadStream(path)
    .pipe(require('csv-parser')(['name', 'status']))
    .on('data', row => {
        //this won't make error
        this.pushBulkData(row, importData);
    })
    .on('end', function () {

        // We are done
    })
});

Или, если вы не хотите использовать функцию стрелки, вы можете сохранить this в другой переменной и использовать ее.

async import(path){

    var dest = fs.createWriteStream(path);

    src.pipe(dest);

    let importData = [];
    const _this = this;
    src.on('end', function() {
        fs.createReadStream(path)
        .pipe(require('csv-parser')(['name', 'status']))
        .on('data', function (row) {
            //this won't make error
            _this.pushBulkData(row, importData);
        })
        .on('end', function () {

            // We are done
        })
    });
    src.on('error', function(err) { console.log('error on upload file'); });
}
0 голосов
/ 17 сентября 2018

Попробуйте перейти к функциям со стрелками, поскольку они не имеют своего собственного контекста "this". Итак, родительский класс «this» будет тем, к чему он относится:

    src.on('end', () => {
        fs.createReadStream(path)
        .pipe(require('csv-parser')(['name', 'status']))
        .on('data', row => {
            //this makes error
            this.pushBulkData(row, importData);
        })
        .on('end', function () {

            // We are done
        })
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...