2016-12-02 56 views
2

我在mysql中的订单表可观的链组,每个订单有许多与之相关联的文件,无论是报价单,发票等有因此第二张称为“文档”的表具有“document_id”主键和“order_id”外键;以类似的方式,我还有另外一种情况,即技术人员对每辆车进行的不同检查,然后是另一张车辆图片。我创建使用节点,并表达需要返回一个类似的JSON Web服务...如何,以前是每一个在forkjoin()操作

[ 
    { 
    "order_id": 1003, 
    "customer_id": 8000, 
    "csi": 90, 
    "date_admitted": "2016-10-28T05:00:00.000Z", 
    "plates": "YZG-5125", 
    ... 
    documents: { 
     "type": "invoice", 
     "number": "1234", 
     ... 
    }, 
    checks: { 
     "scanner": "good", 
     "battery": "average", 
     ... 
    }, 
    vehicle_pictures: { 
     "title": "a title...", 
     "path": "the file path" 
     ... 
    } 
    }, 
    { 
    ... 
    }, 
    ... 
] 

正如你所看到的,它是必要做的每一个订单三个查询,一个用于检查,另一个用于文档,第三个用于图片,那么我需要将这些子结果添加到最终返回响应中的数组的顺序。

在旧版的同步编程中这将是一件非常容易的事情,但是由于mysql库的连接对象中query()方法的异步性质,这种威胁变成了一个真正的地狱。

在需要处理单个订单的情况下,使用forkJoin()在服务器上使用RxJS库就足以一次处理所有三个结果,但我不确定如何“链接”每个(使用forkJoin来管理3个查询),所以所有事情都得到了处理,最后我可以调用res.json(result),并将所有东西都整齐地组合起来。

注:我想RxJS而是采用了同步库包像节点的mysql-的libmysqlclient来解决这个问题。原因基本上是,像Node JS这样的异步语言的“正确”方式是异步的。此外,我想用RxJS而不是异步,Q承诺,或任何其他库,因为观测量似乎是在异步解决方案大赛绝对的赢家,也希望在我开发的所有解决方案一致的,所以这个问题主要是面向对RxJS主人。

而且每一个问题,我在如此的相似,这个发现具有典型的“纯粹”的答复说,如果你正在使用节点你“应该”使用异步不要以为同步解决方案。因此,这是对那些捍卫这一立场是一个挑战,因为这(我认为)是其中的节点同步很有意义的案例之一,但我真的想学习如何与RxJS,而不是以为这是不可能做到这一点,我相信这不是。

+0

你尝试过这么远吗?你卡在哪里?这将净化更好的质量答案。 – paulpdaniels

回答

0

如果我理解正确的事情,你必须要使用通过异步操作,以收集来自数据库的其他数据的一些数据。您希望构建由原始数据和后续查询返回的附加信息组成的组合数据集。

正如你所提到的,你可以使用forkJoin等待多个操作继续之前完成。您必须为数据序列中的每个项目执行此操作,然后使用switchMap将结果合并回原始流。

看一看,演示了如何following example jsbin可以做到这一点:

const data = [ 
    { id: 1, init: 'a' }, 
    { id: 2, init: 'b' }, 
    { id: 3, init: 'c' } 
] 

function getA(id) { 
    return Rx.Observable.timer(1000) 
    .map(() => { 
     return { id, a: 'abc' } 
    }) 
    .toPromise(); 
} 

function getB(id) { 
    return Rx.Observable.timer(1500) 
    .map(() => { 
     return { id, b: 'def' } 
    }) 
    .toPromise(); 
} 

Rx.Observable.interval(5000) 
    .take(data.length) 
    .map(id => data[id]) 
    .do(data => { console.log(`query id ${data.id}`)}) 
    .switchMap((data) => { 
    return Rx.Observable.forkJoin(getA(data.id), getB(data.id), (a, b) => { 
     console.log(`got results for id ${data.id}`); 
     return Object.assign({}, data, a, b); 
    }); 
    }) 
    .subscribe(x => console.log(x)); 
相关问题