Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/453.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript node.js等待任务完成_Javascript_Node.js - Fatal编程技术网

Javascript node.js等待任务完成

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

因此,我编写这个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 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);
});