1

我有這個讓我瘋狂的「設計」問題。模塊返回異步初始化對象

我的目標是建立一個分離的RabbitMQ客戶端。它必須能夠初始化連接並「返回」創建的通道,以便我的發佈模塊可以使用它。

代碼看起來像這樣(我知道這不是更好的代碼,但我期望它用於此解釋)。

var createConnection = (function() { 

var channel; 
var connect = function(){ 
     // amqp connect 
     // error handling 
     createChannel(); 
    }); 
} 

var createChannel = function(){ 
    //amqpConn.createConfirmChannel... 
} 

//pseudo 
return{ 
    getChannel : function(){ 
     if(!initiated) 
      connect(); 
     return channel; 
    } 
} 
})(); 

module.exports = createConnection; 

現在,重要的事情:

1 - 我知道這是不是要去工作,我知道爲什麼,它的簡化。
2-我知道我可以通過使用異步或承諾來實現我的目標。
3-也許沒有意義去耦兔子客戶端,但對於瞭解目的

這就是說,我的問題:

1 - 有什麼辦法,我可以做到這一點,而無需使用其他模塊?
2-如果是這樣,可以花哨和時尚的方式完成?
3-是否有任何奇特的解決方案,允許第三方代碼執行簡單的「發佈(交換,渠道,味精)」確定連接已建立?

我覺得能夠與JS一起工作,但有時你只需要做一件事情,只知道你可以,但這讓我頭痛。

真正的感謝,我希望這個問題是理解:)我發現處理這

+1

也許通過使用一個承諾? – epascarello

+0

嗨,謝謝你的回答:) 正如我所說: 2-我知道我可以通過使用異步或承諾來實現我的目標。 所以,如果沒有承諾是不可能的,那我就沒問題了。我需要知道如果沒有其他模塊,有沒有好的方法來做到這一點。 此致敬禮。 – Damont

+0

不直接回答你的問題,但不是直接導出某些東西,我發現導出一個函數可以方便地導出一個函數,該函數一旦被調用就會爲你創建連接,但顯式而不是懶惰。然後,您可以設置應用程序的引導部分,它將實例化連接並在準備就緒時將其提供給其他模塊。如果有兩個模塊同時調用'getChannel',它們可能都會調用'connect'(取決於你放置'started = true'開關的位置)。 – dvlsg

回答

0

一種方法是來包裝你的異步對象的對象,它是瞭解你的對象的異步狀態,並提出了無論異步對象是否已完成初始化,都是相同的API。

例如,您可以將您的channel對象包裝在另一個呈現相同方法的對象中,但內部會檢查實際的channel對象是否已初始化。如果是這樣,請照常使用。如果不是,請等待它被初始化並正常使用它。包裝器對象的用戶不需要知道該通道是否被實際初始化。這樣做的主要缺點是每個需要訪問channel的包裝方法必須是異步的,即使它在channel上訪問的方法是同步的。

例子:

function initializeChannel() { 
    return new Promise((resolve, reject) => { 
    // create, initialize, and resolve channel 
    }); 
} 

module.exports = { // wrapper 
    channelPromise: initializeChannel(), 
    foo(a) { 
    return this.channelPromise.then((channel) => channel.foo(a)); 
    } 
};