Всем привет!
Не получается рекурсивно за-yield-ить генератор причём еще в цикле. Использую Koa и CO
Ругается на строку yield* gen(params.src + '/' + child, (params.obj ? params.obj[shortName] : hierarchies[shortName]));
Promise is not function
'use strict';
const fs = require('fs');
const hierRoot = require('config').hierarchiesRoot;
const parseString = require('xml2js').parseString;
const config = require('config');
var co = require('co');
var path = require('path');
var hierarchies = {};
function checkForXml(src, obj) {
return new Promise(function (resolve, reject) {
fs.readdir(src, function (err, data) {
if (err) throw err;
if (data.indexOf('properties.xml') != -1) {
let params = {
src: src,
obj: obj
};
resolve(params);
}
});
});
}
function readXml(params) {
return new Promise(function (resolve, reject) {
let xmlData = fs.readFile(params.src + '/properties.xml', function (err, data) {
if (err) throw err;
params.xml = data;
resolve(params);
});
});
}
function parseXml(params) {
return new Promise(function (resolve, reject) {
parseString(params.xml, function (err, result) { // парсим xml
if (err) throw err;
if (!result['SPEC-HIERARCHY']['$']['SHORT-NAME']) {
throw new Error('SPEC-HIERARCHY SHORT-NAME if not defined !!!');
}
let shortName = result['SPEC-HIERARCHY']['$']['SHORT-NAME'];
if (params.obj) { // on first iteration it must be NULL
params.obj[shortName] = {};
} else {
hierarchies[shortName] = {};
}
if (result['SPEC-HIERARCHY']['CHILD']) {
let shortNameChilds = childHir(result['SPEC-HIERARCHY']['CHILD']);
params.childs = shortNameChilds;
resolve(params);
}
});
});
}
function childHir(childs) {
let arr = [];
childs.forEach(function (child) {
arr.push(child['$']['SHORT-NAME']);
});
return arr;
}
function* gen (src, hierObj) {
let params = yield checkForXml((src ? src : hierRoot), (hierObj ? hierObj : null));
params = yield readXml(params);
params = yield parseXml(params);
if (params.childs || params.childs.length > 0) {
params.childs.forEach(co(function* (child) {
yield* gen(params.src + '/' + child, (params.obj ? params.obj[shortName] : hierarchies[shortName]));
}));
}
}
module.exports = function* (next) {
yield* gen;
hierarchies = JSON.stringify(hierarchies)
yield this.render('index', { hierarchies : hierarchies});
};