nodejs synchronus调用快速csv

时间:2017-01-17 05:58:29

标签: node.js promise synchronization

我正在使用快速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处理结束时成功打印导入。

1 个答案:

答案 0 :(得分:1)

on("data", function(data){})没有完整的数据。它要求每一条记录。如果我们把api放在这里,那么这可能会调用许多时间API。

on("end", function() {})在csv导入成功后执行。它不依赖于任何api,它只依赖于csv导入。

我们有两种方法可以做到这一点。

1。在end方法

中调用API

将数据存储在数组中,最后调用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");
});

2。创建回调函数

如果第一种方法不适合条件,那么我们可以使用这种方法。但第一种方法更好。

在这种方法中,我们创建了一个回调函数,我们在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");
}