2016-12-02 59 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)); 
相關問題