[英]RxJS and Busboy
There is a busboy library . 有一个服务员图书馆 。 With some promise library I can collect the whole form data in one object with code below: 使用一些promise库,我可以使用以下代码将整个表单数据收集到一个对象中:
var p = new Promise((resolve) => {
let res = {}
busboy.on('file', (fieldname, file, filename, encoding, mimetype)=> {
let name = uuid.v1()
let extension = path.extname(filename)
let saveTo = path.resolve(mediaPath, `${name}${extension}`)
file.pipe(fs.createWriteStream(saveTo))
res = _.extend(res, {
[fieldname]: { filename }
})
})
busboy.on('field', (key, value, keyTruncated, valueTruncated) => {
res = _.extend({[key]: value})
})
busboy.on('finish', () => resolve(res))
})
p.then((data) => ...
It works, but it looks a little bit spaghetti-like. 它可以工作,但看起来有点像意大利面条。 Is there a way to improve this sample with RxJS? 有没有办法使用RxJS改进此示例?
I can think about some ways to use Rxjs for this, but I am not sure this means necessary less code. 我可以考虑一些使用Rxjs的方法,但是我不确定这意味着需要更少的代码。
You could : - wrap your busboy library events the same way than DOM events can be wrapped using Rx.Observable.fromEvent
. 您可以:-与使用Rx.Observable.fromEvent
包装DOM事件的方式相同,包装Rx.Observable.fromEvent
库事件。
And then do something like this: 然后执行以下操作:
var fileEvent$ = Rx.Observable.fromBusyBoyEvent('file');
var fieldEvent$ = Rx.Observable.fromBusyBoyEvent('field');
var finishEvent$ = Rx.Observable.fromBusyBoyEvent('finish');
var processFileEvent = function ( res, fieldname, file, filename, encoding, mimetype ) {
/*code here*/
return {res : /* something*/, done : false}
};
var processFieldEvent = function ( res, key, value, keyTruncated, valueTruncated ) {/*code here*/
return {res : /* something*/, done : false}
};
var processFinishEvent = function ( res ) {return {res : res, done : true}};
var passReducer = function ( reduce_fn ) {
return function () {
return {args : arguments, reduce_fn : reduce_fn}
}
};
var res$ = Rx.Observable
.merge(
fileEvent$.map(passReducer(processFileEvent)),
fieldEvent$.map(passReducer(processFieldEvent)),
finishEvent$.map(passReducer(processFinishEvent)))
.scan(function ( acc, command ) {
return command.reduce_fn.apply(null, command.args);
}, {})
.filter(function ( acc ) {return acc.done});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.