如何在异步函数内调用父类函数

时间:2018-09-17 07:02:04

标签: javascript node.js asynchronous

我需要在流读取事件内部触发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 :(得分:2)

请尝试更改为箭头功能,因为它们没有自己的“ 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
        })
    });

答案 1 :(得分:1)

是的绑定将在这里工作。但是可以使用粗箭头功能,这样就不会失去上下文。

let organisations: Array<{name: string, collapsed: boolean}> = [];

或者,如果您不想使用箭头功能,则可以将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