我想了解一下Node和異步編程。我閱讀了有關Promises的信息,並試圖在一個小型項目中將它們用於從服務A複製到服務B的用戶。我在理解如何在Promises之間傳遞狀態方面存在一些困難有什麼模式通過JavaScript中的承諾鏈傳遞狀態?
項目已寫入使用我目前的問題Promise library
一個簡單的定義是的NodeJS:
- 從服務A到服務B用戶複製帖子如果帖子不服務B.
- 已經存在這兩種服務都提供了http API,令人難忘的用戶標識來查找該用戶的帖子,所以用戶標識必須從用戶名中查找。
- 所有的http調用都是異步的。
這是一些僞代碼,說明我如何將Promises鏈接在一起。
Promise.from('service_A_username')
.then(getServiceAUserIdForUsername)
.then(getServiceAPostsForUserId)
.then(function(serviceAPosts) {
// but what? store globally for access later?
doSomethingWith(serviceAPosts);
return Promise.from('service_B_username');
})
.then(getServiceBUserIdForUsername)
.then(getServiceBPostsForUserId)
.done(function(serviceBPosts) {
// how do we interact with Service A posts?
doSomethingThatInvolvesServiceAPostsWith(serviceBPosts);
});
有一對夫婦的事情,我也想過做:
- 帶上getPostsForUserId函數內getIdForUsername電話。 然而,,我想保持每個功能單元儘可能簡單,遵循'做一件事,做得好'的原則。
- 創建一個'context'對象並將其傳遞到整個鏈中,讀取並存儲此對象中的狀態。 但是這種方法使每個功能都非常適合於一個鏈,因此很難單獨使用。
是否還有其他選擇,建議採用哪種方法?
FWIW,上下文對象選項不是全部*那*壞。如果你認爲'getServiceAUserIdForUsername'函數是「接受一個'userName''參數並返回一個'userId''',那麼''接受一個具有'userName'屬性並填充'userId'屬性的對象不是*那個*更具體到一個用例。這裏肯定有更多的耦合(調用代碼和函數需要同意這些名稱,通常他們不會這樣做),但事實是,如果您不僅需要「一個參數導致一個返回值」,您需要有一些方法來識別不同的位。 –
但是如果你想,我可以看到有一個通用的聚合器基礎設施,所以只有調用代碼知道這些屬性名稱。聚合器基礎結構將接受你的「一個arg產生一個結果」的列表,這些啓動函數(因此沒有這些函數已知的名稱)和要使用的名稱,並將調用包裝到它們以填充對象。嗯。我不知道會是什麼樣子。 –
感謝@ t-j-crowder關於通過管道傳遞的上下文對象,您是否知道任何特別使用此模式的JS庫? Java有[Apache Camel](http://camel.apache.org/),它專門用於這種路由,我想知道是否有類似的js。 –