Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 27.08.2015, 19:10
Новичок на форуме
Отправить личное сообщение для Octav Посмотреть профиль Найти все сообщения от Octav
 
Регистрация: 10.07.2015
Сообщений: 2

Как рекурсивно yield-ить генераторы
Всем привет!

Не получается рекурсивно за-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});

};
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Открытие div блока при первом визите на сайт Nushaba Общие вопросы Javascript 28 20.12.2013 21:24
Решение проблемы кодировок для AJAX и PHP без iconv (cp1251 в AJAX) Serge Ageyev AJAX и COMET 10 24.04.2013 20:48
Как организовать RichEdit arma Элементы интерфейса 2 18.02.2010 14:57
О наследовании событий, или как корректно его отменить. JCShen Events/DOM/Window 8 09.02.2010 00:00
Как правильно послать XML в POST запросе LowCoder AJAX и COMET 10 15.07.2009 23:20