我正在使用快速csv来读取下面的csv文件是下面给出的代码
var csv = require("fast-csv");
csv.fromPath("userlists.csv")
.transform(function(obj){
return {
email: obj.email,
firstname: obj.firstname,
lastname: obj.lastname
};
})
.on("data", function(data){
// Some promise call for API
})
.on("end", function(){
response.send("Imported successfully");
console.log("done");
});
Inside on(“data”,function(data){})我正在使用promise调用某些API,这些API需要一些时间进行处理。 读取csv文件后立即显示“导入成功”,无需等待API处理。 我想在所有API处理结束时成功打印导入。
答案 0 :(得分:1)
on("data", function(data){})
没有完整的数据。它要求每一条记录。如果我们把api放在这里,那么这可能会调用许多时间API。
on("end", function() {})
在csv导入成功后执行。它不依赖于任何api,它只依赖于csv导入。
我们有两种方法可以做到这一点。
end
方法将数据存储在数组中,最后调用on("end", function() {})
方法。
var csvdata = [];
var csv = require("fast-csv");
csv.fromPath("userlists.csv")
.transform(function(obj){
return obj;
})
.on("data", function(data){
csvdata.push(data);
})
.on("end", function(){
// Some promise call for API
// In API promise callback
response.send("Imported successfully");
console.log("done");
});
如果第一种方法不适合条件,那么我们可以使用这种方法。但第一种方法更好。
在这种方法中,我们创建了一个回调函数,我们在api回调中调用它。我们知道api在这种方法中多次调用,因为这个on("data"
方法调用每个记录。所以我们需要在api成功之后打电话。
var csv = require("fast-csv");
csv.fromPath("userlists.csv")
.transform(function(obj){
return {
email: obj.email,
firstname: obj.firstname,
lastname: obj.lastname
};
})
.on("data", function(data){
// Some promise call for API
// promises callback handle
Promise.all([/*api promise list here*/]).then(function() {
handleSuccessResponse(response);
}
})
.on("end", function(){
});
function handleSuccessResponse(response) {
response.send("Imported successfully");
console.log("done");
}