在 async.filter() 数组 nodejs 中获取异步结果
Get async result in async.filter() array nodejs
需要从具有 file_path
值的 mass
数组中解析一些 XML 文件。
尝试使用 async
、fs
、xml2js
。
当使用单个字符串 file_path
时,一切都很完美。但是当我将 aync.filter()
与数组一起使用时,我无法理解如何从 xml.parseString()
return result
const fs = require('fs');
const xml2js = require('xml2js');
const async = require('async');
var mass=['/file1.xml','/fil2.xml','/file3.xml',...]
async.filter(mass, async function(file_path, callback){
if(fs.statSync(file_path)['size']>0){
fs.readFileSync(file_path, 'utf8', function(err, data) {
xml.parseString(data, function (err, result) {
console.log(Object.keys(result)[0]);
return result; //need get this result to results array
})
})
}
}, function(err, results) {
console.log(results)
});
谁能理解它是如何工作的以及我需要在我的代码中更改什么。
非常感谢!
您正在尝试同时映射和过滤。由于您的过滤条件是同步可用的,因此使用数组 filter
方法,然后将其传递给 async.map
。
然后您应该调用 async.map
提供给您的回调函数,将结果传递给它。所以不要 return 它,而是调用回调。
readFileSync
方法不像其异步方法那样采用回调。它只是 return 数据。
此外,删除 async
关键字,因为您根本没有使用 await
关键字。
async.map(mass.filter((file_path) => fs.statSync(file_path).size > 0),
function(file_path, callback){
var data = fs.readFileSync(file_path, 'utf8');
xml.parseString(data, function (err, result) {
console.log(Object.keys(result)[0]);
callback(null, result);
})
}, function(err, results) {
console.log(results)
});
然而,应该注意的是,由于 Node 现在带有 Promise API,甚至 async/await
扩展,async
模块变得不那么有趣了。考虑使用 Promises。
const promises = mass.filter(file_path => {
return fs.statSync(file_path).size > 0
}).map(function(file_path) {
return new Promise(resolve => {
const data = fs.readFileSync(file_path, 'utf8');
xml.parseString(data, function (err, result) {
console.log(Object.keys(result)[0]);
resolve(result);
});
});
});
Promise.all(promises).then(results => {
console.log(results);
});
需要从具有 file_path
值的 mass
数组中解析一些 XML 文件。
尝试使用 async
、fs
、xml2js
。
当使用单个字符串 file_path
时,一切都很完美。但是当我将 aync.filter()
与数组一起使用时,我无法理解如何从 xml.parseString()
return result
const fs = require('fs');
const xml2js = require('xml2js');
const async = require('async');
var mass=['/file1.xml','/fil2.xml','/file3.xml',...]
async.filter(mass, async function(file_path, callback){
if(fs.statSync(file_path)['size']>0){
fs.readFileSync(file_path, 'utf8', function(err, data) {
xml.parseString(data, function (err, result) {
console.log(Object.keys(result)[0]);
return result; //need get this result to results array
})
})
}
}, function(err, results) {
console.log(results)
});
谁能理解它是如何工作的以及我需要在我的代码中更改什么。 非常感谢!
您正在尝试同时映射和过滤。由于您的过滤条件是同步可用的,因此使用数组 filter
方法,然后将其传递给 async.map
。
然后您应该调用 async.map
提供给您的回调函数,将结果传递给它。所以不要 return 它,而是调用回调。
readFileSync
方法不像其异步方法那样采用回调。它只是 return 数据。
此外,删除 async
关键字,因为您根本没有使用 await
关键字。
async.map(mass.filter((file_path) => fs.statSync(file_path).size > 0),
function(file_path, callback){
var data = fs.readFileSync(file_path, 'utf8');
xml.parseString(data, function (err, result) {
console.log(Object.keys(result)[0]);
callback(null, result);
})
}, function(err, results) {
console.log(results)
});
然而,应该注意的是,由于 Node 现在带有 Promise API,甚至 async/await
扩展,async
模块变得不那么有趣了。考虑使用 Promises。
const promises = mass.filter(file_path => {
return fs.statSync(file_path).size > 0
}).map(function(file_path) {
return new Promise(resolve => {
const data = fs.readFileSync(file_path, 'utf8');
xml.parseString(data, function (err, result) {
console.log(Object.keys(result)[0]);
resolve(result);
});
});
});
Promise.all(promises).then(results => {
console.log(results);
});