2014-09-03 10 views
2

我有一個事件流:使用highland.js與原始流數據引用執行一系列任務異步

var eventStream = _([{ 
    id: 1, foo: 'bar' 
}, { 
    id: 2, foo: 'baz' 
}]); 

因爲我需要裝載模型的實例流中的每個事件(我DAL返回承諾),然後在模型的每個實例上調用一個方法,將原始事件數據中的一些數據作爲參數傳遞。

模型加載情況並不太難:

eventStream.map(function(data) { 
    return getModelPromise(data.id); 
}).map(_).merge(); // result is a stream of model instances 

但是,一旦我有模型,我無法弄清楚如何調用該模型的方法,並通過data.foo它。基本上,每個實例我需要做的:

modelInstance.doStuff(data.foo); 

我已經打了分叉流,上叉拉模型,然後以不同的組合使用zipinvoke,但我沒有任何運氣。有了異步,我可以通過適當的關閉用戶簡單地處理這個問題。我怎樣才能用highland.js來實現這一點呢?

回答

8

要做的最簡單的事情可能是包裝getModelPromise,以便它返回一個承諾,將您的模型和數據作爲屬性而不僅僅是您的模型解析爲對象。

或者,如果你不想使用一個承諾,你可以做到這一點在高地:

var modelStream = eventStream.map(function (data) { 
    return _(getModelPromise(data.id)).map(function (model) { 
     return {data: data, model: model}; 
    }); 
}).parallel(10); 

// then... 
modelStream.map(function (x) { 
    x.model.doStuff(x.data.foo); 
}); 

荏苒的modelStream和eventStream也應該工作的觀測版本,但我通常喜歡通過圍繞着所有你需要的東西。

+0

所以@caolan如果你有3個流和#3取決於#1和#2的輸出,那麼「最佳做法」是將數據注入流? (現在我想到了,這也是Play框架中的請求的工作原理。) – 2015-03-26 04:47:18