xml read by event emitter and saved promise way



I got library xml-stream which reads xml from stream and emits 'endElement' event on every interesting tag, under the hood it uses node-expat which is also written event way


On every tag I want to save it to database with bookshelf/knex ORM which use promises


The problem I've met is finding out when to end the process; lib emits event 'end' when it finish reading from stream but writing to db is not yet finished so process can't exit


XML is huge so I can't wait to read every tag and then resolve write promisses


does anybody know a better way to do something like that other way than with timeout:



parseSaveCallback => {
var stream = fs.createReadStream(__dirname + '/xml/' + xmlFile);
var xmlStream = new XmlStream(stream);

var streamEndDeferred = Promise.defer()
xmlStream.on('end', function(){
streamEndDeferred.resolve()
})

var writeTimeout
var writeTimeoutDeferred = Promise.defer()
var refreshTimeout = function() {
clearTimeout(writeTimeout)

writeTimeout = setTimeout(function(){
writeTimeoutDeferred.resolve()
}, 5000)
}

xmlStream.preserve(xmlElement)
xmlStream.on('endElement: ' + xmlElement, function (item) {
parseSaveCallback(item)
.then(function(){
refreshTimeout()
})
})

return Promise.join(
streamEndDeferred.promise,
writeTimeoutDeferred.promise
)
}
//.then(process.exit) ???


or is there any library for reading and saving XML from stream compatibile with promises? further XML will be read from HTTP and will contain GB's of data


No comments:

Post a Comment