2015-12-21 63 views
1
的NodeJS我

有下面的代碼:返回列表與

var fs = require("fs"); 

function getMediaList(){ 
    var media_copy_list, line_list; 
    media_copy_list = []; 

    fs.readFile("input.csv", function(err, data) { 

     line_list = data.toString('utf-8').trim().split('\n'); 
     return line_list.forEach(function(file_line) { 
     var output_path, source_path, split_list; 
     if (file_line.length) { 
      split_list = file_line.split(';'); 
      console.log(split_list[0]); 
      if (split_list.length >= 2) { 
      source_path = split_list[0].toString('utf-8').trim(); 
      output_path = split_list[1].toString('utf-8').trim(); 
      media_copy_list.push({ 
       source: source_path, 
       destination: output_path 
      }); 
      } 
     } 
     }); 
    }); 
} 

你可以看到,我正在填充的列表,包括:

media_copy_list.push({ 
    source: source_path, 
    destination: output_path 
}); 

我想怎麼辦是在我讀完input.csv文件後返回此列表。

我沒有任何問題,如果我同步閱讀文件(只需撥打return media_copy_list)。但在這種情況下,我不知道。

我聽說async.parallel但真的不知道如何申請。

input.csv

例子:

FirstPart;二部

測試/ test2的;無論/例如

+0

結果返回到哪裏? – thefourtheye

+0

對不起,其實代碼是在一個函數。所以函數應該返回它 – AshBringer

+0

請編輯該問題幷包含所有相關信息。 – thefourtheye

回答

1

只需將您的代碼包裝在承諾中,並在完成後解決。有些人提出了回調,它們幾乎完全相同,但現在這種模式令人沮喪。你應該真的使用承諾。

var fs = require("fs"); 

function getMediaList(file){ 
    return new Promise(function (resolve, reject) { 
    fs.readFile(file, 'utf-8', function(err, data) { 
     if (err) { 
     return reject(err); 
     } 

     resolve(data.split('\n').reduce(function(media_copy_list, file_line) { 
     var output_path; 
     var source_path; 
     var split_list; 

     file_line = file_line.trim(); 

     if (file_line.length) { 
      split_list = file_line.split(';'); 
      console.log(split_list[0]); 

      if (split_list.length >= 2) { 
      source_path = split_list[0].toString('utf-8').trim(); 
      output_path = split_list[1].toString('utf-8').trim(); 
      media_copy_list.push({ 
       source: source_path, 
       destination: output_path 
      }); 
      } 
     } 

     return media_copy_list; 
     }, [])); 
    }); 
    }); 
} 

然後,調用與

getMediaList('input.csv').then(function (mediaList) { 
    // ... 
}).catch(function (err) { 
    console.error(err.stack); 
}); 

注意:藍鳥,Q等都是由於節點4.2+完全沒有必要。除非您使用早期版本的節點,否則請儘量避免使用它們。 IMO。

爲什麼鼓勵Promise真正的原因是因爲節點將實現異步/ AWAIT,這將允許你這樣調用完全相同的功能:

var mediaList = await getMediaList('input.csv'); 
1

正如在評論中指出,你不希望返回從列表該函數..你應該做的是包括一個回調作爲getMediaList的參數,並調用回調與你的結果。我會使用async.each來遍歷文件中的行。你可以在這裏閱讀更多關於async.each:https://github.com/caolan/async#each。這裏是一個例子:

var fs = require("fs"); 

function getMediaList(callback){ 
    var media_copy_list, line_list; 
    media_copy_list = []; 

    fs.readFile("input.csv", function(err, data) { 
     if(err) { 
     return callback(err); 
     } 
     line_list = data.toString('utf-8').trim().split('\n'); 
     async.each(line_list, function(file_line, next) { 
     var output_path, source_path, split_list; 
     if (file_line.length) { 
      split_list = file_line.split(';'); 
      console.log(split_list[0]); 
      if (split_list.length >= 2) { 
      source_path = split_list[0].toString('utf-8').trim(); 
      output_path = split_list[1].toString('utf-8').trim(); 
      media_copy_list.push({ 
       source: source_path, 
       destination: output_path 
      }); 
      } 
     } 
     next(err); 
     }, function (err) { 
     callback(err, media_copy_list); 
     } 
    }); 
} 
0

或者你可以使用承諾(藍鳥在下面的情況下)。

var Promise = require('bluebird'), 
fs = require("fs"), 
media_copy_list, line_list, 
media_copy_list = []; 

fs.readFile("input.csv", function(err, data) { 
line_list = data.toString('utf-8').trim().split('\n'); 
    Promise.map(line_list, function(file_line) { 
    var output_path, source_path, split_list; 
    if (file_line.length) { 
     split_list = file_line.split(';'); 
     if (split_list.length >= 2) { 
     source_path = split_list[0].toString('utf-8').trim(); 
     output_path = split_list[1].toString('utf-8').trim(); 
     media_copy_list = { 
      source: source_path, 
      destination: output_path 
     }; 
     } 
    } 
    return media_copy_list 
}).then(function(values){ 
    console.log(values); 
}) 

});