简体   繁体   English

RxJS和Busboy

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM