Javascript node.js等待任务完成
因此,我编写这个node.js程序将XML文件导入JSON对象数组。我有两个文件要导入,teachers.xml和students.xml 教师和学生包含数千条关于教师和学生的信息。我的代码很好地覆盖了那个部分 这是用于解析文件的javascript文件:Javascript node.js等待任务完成,javascript,node.js,Javascript,Node.js,因此,我编写这个node.js程序将XML文件导入JSON对象数组。我有两个文件要导入,teachers.xml和students.xml 教师和学生包含数千条关于教师和学生的信息。我的代码很好地覆盖了那个部分 这是用于解析文件的javascript文件: var fs = require('fs'); var xmldom = require('xmldom'); var async = require('async'); // Parse `catalog` xml file and ca
var fs = require('fs');
var xmldom = require('xmldom');
var async = require('async');
// Parse `catalog` xml file and call `callback(catalog domxml root)`
function parse_catalog(catalog, callback) {
// Read xml file content
fs.readFile(catalog, function (err, data) {
if (err) {
throw 'Error reading XML catalog';
} else {
// Parse xml content and return dom root
var domRoot = new xmldom.DOMParser().parseFromString(data.toString());
// Call callback passing dom root
callback(domRoot)
}
});
}
我有两种类似的方法将xml转换为json,并且可以完美地工作(一种用于教师,另一种用于学生)
当我这样做时:
parse_catalog('teachers.xml', convert_teachers);
parse_catalog('students.xml', convert_students);
一个或另一个将首先完成,这取决于要导入的元素的数量,我认为这是正常的
我想要的是等待两者都被导入,然后执行一些javascript操作,这就是我被卡住的地方
我尝试使用async来实现这一点,但它不会等到两个文件导入完毕
async.parallel([
function(callback) {
parse_catalog('teachers.xml', convert_teachers);
callback();
},
function(callback) {
parse_catalog('students.xml', convert_students);
callback();
}
], function(err) {
if (err) return next(err);
console.log("Finished");
//Enventually some Javascript manipulations on the two arrays
});
实际上它输出:
Finished
Teachers are now in JSON format
Students are now in JSON format
或取决于文件大小
Finished
Students are now in JSON format
Teachers are now in JSON format
我想要的更像:
Teachers are now in JSON format (or students)
Students are now in JSON format (or teachers)
Finished
我计划再加载2个文件,加载顺序对我来说并不重要
有线索吗?谢谢 您在
async.parallel()
函数中执行callback()
太快了,因为那时fs.readFile()
甚至还没有启动。请尝试以下方法:
function parse_catalog(catalog, callback) {
// Read xml file content
fs.readFile(catalog, function(err, data) {
if (err)
return callback(err);
// Parse xml content and return dom root
var domRoot = new xmldom.DOMParser().parseFromString(data.toString());
// Call callback passing dom root
callback(null, domRoot);
});
}
// Convert teacher XML into json format in a array
function convert_teachers(domCatalog) {
var teachers = domCatalog.getElementsByTagName('teacher');
var teachers_arr = [];
for (var i = 0; i < teachers .length; i++) {
var teacher = teachers[i];
...
//Reading the xml
teachers_arr.push({
...
//Create the json
});
}
console.log('Teachers are now in JSON format');
return teachers_arr;
}
// and similarly for `convert_students`
async.parallel({
teachers: function(callback) {
parse_catalog('teachers.xml', function(err, domCatalog) {
if (err)
return callback(err);
var teachers = convert_teachers(domCatalog);
callback(null, teachers);
});
},
students: function(callback) {
parse_catalog('students.xml', function(err, domCatalog) {
if (err)
return callback(err);
var students = convert_students(domCatalog);
callback(null, students);
});
}
}, function(err, results) {
if (err) return next(err);
console.log('Finished');
// here you have `results.teachers` and `results.students`
console.dir(results);
});
函数解析_目录(目录,回调){
//读取xml文件内容
fs.readFile(目录、函数(错误、数据){
如果(错误)
返回回调(err);
//解析xml内容并返回dom根目录
var domRoot=new xmldom.DOMParser().parseFromString(data.toString());
//传递dom根的调用回调
回调(null,domRoot);
});
}
//将教师XML转换为数组中的json格式
函数转换(domCatalog){
var teachers=domCatalog.getElementsByTagName('teacher');
var\u arr=[];
for(var i=0;i
谢谢!您能否指出为什么在parse_catalog()中添加了“callback(null,domRoot)”?因为parse_catalog()
正在执行一个异步操作,所以您需要在完成后使用结果调用回调。如果它导致错误,那么错误对象将作为第一个参数传递(null
否则表示成功)。如果没有错误,则将结果(domRoot
)传递给回调。
Teachers are now in JSON format (or students)
Students are now in JSON format (or teachers)
Finished
function parse_catalog(catalog, callback) {
// Read xml file content
fs.readFile(catalog, function(err, data) {
if (err)
return callback(err);
// Parse xml content and return dom root
var domRoot = new xmldom.DOMParser().parseFromString(data.toString());
// Call callback passing dom root
callback(null, domRoot);
});
}
// Convert teacher XML into json format in a array
function convert_teachers(domCatalog) {
var teachers = domCatalog.getElementsByTagName('teacher');
var teachers_arr = [];
for (var i = 0; i < teachers .length; i++) {
var teacher = teachers[i];
...
//Reading the xml
teachers_arr.push({
...
//Create the json
});
}
console.log('Teachers are now in JSON format');
return teachers_arr;
}
// and similarly for `convert_students`
async.parallel({
teachers: function(callback) {
parse_catalog('teachers.xml', function(err, domCatalog) {
if (err)
return callback(err);
var teachers = convert_teachers(domCatalog);
callback(null, teachers);
});
},
students: function(callback) {
parse_catalog('students.xml', function(err, domCatalog) {
if (err)
return callback(err);
var students = convert_students(domCatalog);
callback(null, students);
});
}
}, function(err, results) {
if (err) return next(err);
console.log('Finished');
// here you have `results.teachers` and `results.students`
console.dir(results);
});