Javascript 如何仅从这两个观察对象创建一个订阅?

Javascript 如何仅从这两个观察对象创建一个订阅?,javascript,rxjs,Javascript,Rxjs,我有一个函数,可以从可读流中读取数据,然后将结果保存在Parse中: const { from } = require('rxjs'); const Observable = require('rxjs').Observable; const jsArr = []; fromStream(fs.createReadStream(req.file.path, 'utf-8').pipe(csv())) .map((data) => data.USERNAME)

我有一个函数,可以从可读流中读取数据,然后将结果保存在Parse中:

const { from } = require('rxjs');
const Observable = require('rxjs').Observable;
const jsArr = [];

fromStream(fs.createReadStream(req.file.path, 'utf-8').pipe(csv()))
        .map((data) => data.USERNAME)
        .subscribe(
            (data) => jsArr.push(data),
            (error) => console.log(error),
            () => {
                const CSVData = Parse.Object.extend('CSVData');
                const csv = new CSVData();
                csv.set('CSV',jsArr);

                from (csv.save())
                .subscribe(
                    () => res.json(serialize({type:'success'})),
                    (error) => console.log(error)
                );

            }
        );
它工作得非常好,但我想知道是否有一种方法可以更干净地完成它,只使用一个订阅者


有可能吗?

我想你可以这样做,但很明显,我还没有测试过

fromStream(fs.createReadStream(req.file.path, 'utf-8').pipe(csv()))
  .map((data) => data.USERNAME)
  .toArray(),
  .concatMap(jsArr => {
    const CSVData = Parse.Object.extend('CSVData');
    const csv = new CSVData();
    csv.set('CSV',jsArr);

    return from(csv.save());
  })
  .subscribe(
    () => res.json(serialize({type:'success'})),
    (error) => console.log(error)
  )

首先
reduce
并获取要保存的结果,然后保存结果:

 fromStream(fs.createReadStream(req.file.path, 'utf-8').pipe(csv()) )
            .map((data) => data.USERNAME)
            .reduce((acc, curr) => acc.push(curr), [])
            .switchMap(resultArray => {
                    const CSVData = Parse.Object.extend('CSVData');
                    const csv = new CSVData();
                    csv.set('CSV',resultArray);
                    return from (csv.save());

             }).subscribe(x =>{})
上述方法可能更简单,并且遵循良好的函数式编程概念,这里您不需要使用属性
jsArr