我有以下代码:
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;SecondPart
Test/test2;Whatever/example
最佳答案
只需将代码包装在 Promise 中,并在完成后才解决它。有些人建议回调,它的作用几乎相同,但现在不鼓励这种模式。你真的应该使用 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 的原因是 Node 将实现 async/await,这将允许您调用完全相同的函数,例如:
var mediaList = await getMediaList('input.csv');
关于node.js - 使用nodejs从异步函数返回列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34397631/