我需要在流读取事件内部触发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}
);
}
}
}
答案 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