我有以下代码:
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
:
第一部分;第二部分
测试/测试2;无论/示例
只需将代码包装在Promise中,然后在完成后就解决它。有些人建议使用回调,其作用几乎相同,但是现在不建议使用此模式。您应该真正使用诺言。
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);
});
注意:从Node 4.2+开始,bluebird,Q等都是不必要的。除非您使用的是早期版本的Node,否则请尽量避免使用它们。海事组织。
Promise
鼓励使用s的原因是因为Node将实现async / await,这将允许您调用此完全相同的函数,例如:
var mediaList = await getMediaList('input.csv');
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句