2016-03-02 35 views
2

有沒有什麼辦法可以把承諾作爲一種承諾產生的結果?如何發送承諾中的收益結果作爲快遞4中的流?

在某些情況下JSON有效負載將是巨大的,它將它作爲一個流發送是有道理的。

function aPromise() { 
    // result of a postgres query. Using `pg` 
    return Promise.resolve([ 
      {key1: val1, key2: val2 } 
    ]); 
    }); 
} 

//express 4 router 
let wrap = require('co-express'); 

router.get('/', wrap(function* (req, res, next) { 
    let payload; 

    try { 
     payload = yield aPromise(); 
    } catch (e) { 
     return next(e); 
    } 

    res.json(payload); 
})); 

回答

0

如果你獲取和加載到內存中您迴應的整個對象,這將是很難再重新合理把它變成流。無論如何,這裏需要streaming JSON implementation

Streaming postgress query應該是JSONStream的一個很好的來源。

這裏是你如何使它工作,在那裏我做了一些假設兩個例子:

  1. 您能夠創建的元組這樣的數據流的:每個鍵[key, data]要放在導致json被送出。這假設你的數據是很多密鑰。

    res.set('content-type','application/json'); keystream.pipe(JSONStream.stringifyObject())。pipe(res)

  2. 您能夠創建一個對象流,您想返回作爲數組中的項目作爲最終的json響應。

    res.set('content-type','application/json'); itemsstream.pipe(JSONStream.stringify())。管(RES)

+0

方法'aPromise'使用'pg'獲取一個巨大的數據從postgres的一次性設置。是否還有其他需要的細節? –

+0

您需要知道您的數據結構並決定如何處理它。無論如何,將巨大的數據集拉入節點的內存中並不是一個好主意。這就是爲什麼你應該流。更新我的答案與流 – naugtur

+0

在這種情況下,使用發電機出去折騰,對吧? –