代码之家  ›  专栏  ›  技术社区  ›  Thamaraiselvam

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

  •  0
  • Thamaraiselvam  · 技术社区  · 6 年前

    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 回复  |  直到 6 年前
        1
  •  2
  •   james emanon    6 年前

    尝试更改为箭头函数,因为它们没有自己的“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
            })
        });
    
        2
  •  1
  •   Ridham Tarpara    6 年前

    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'); });
    }