2014-10-06 30 views
2

我正在寫一個應該能夠產生承諾的圖書館。但我不想將我的庫的用戶綁定到任何特定的承諾實現。假設我不會使用任何特定的/實現特定的功能,是否建立了這樣做的最佳實踐?如何使JavaScript庫與多個承諾庫兼容?

例如,是否有一個最小的兼容性庫,它可以檢測Q,Bluebird,AngularJS承諾,ES6承諾...是否被加載,併爲我提供了一個最小的接口,無論它是哪一個?

注:我的圖書館需要產生承諾,我想避免在我自己的庫中捆綁一個完整的承諾庫。 (除非特別小,爲此目的?)

回答

2

因此 - 有Promises/A +規格。

Promises/A+是承諾規範只定義了then方法。它描述了不同的承諾庫如何相互操作 - 有效地服務您描述的目的。

您描述的所有這些庫 - Bluebird,Q和AngularJS的$ q實際上都是A + promise,都是針對測試套件運行的。

您描述的最小界面存在 - 它是then。或者,如果您需要直接創建自己的承諾 - 您可以從該列表中選擇任意一個Promises/A +庫,並且您保證它可以在所有其他庫中工作 - 因爲它們都是承諾/ A +,它們將同化承諾正確。它也可以在不同版本的庫之間工作(減去錯誤)。

如果您在應用中選擇了Promises/A +庫(例如Bluebird),用戶可以使用any conformant implementation

這是the suite。如果你真的希望能夠從頭開始創建的承諾 - 你可以要求用戶提供其同化方法到資料庫 - 例如:

MyLib.init = function init(assimilator){ 
    MyLib.assimilator = assimilator 
} 
MyLib.apiCall = function(){ 
    // assimilate a returned promise from whatever library you want 
    return MyLib.assimilator(promiseYouCreateInWhateverLibrary()); 
} 

MyLib.init(Promise.resolve); // Initialize with Blubird, or native promises 
MyLib.init(Q); // Initializes with Q 
// initialize with any empty promise with any library 
MyLib.init(function(x){ return empty.then(function(x){ return x; }); }); 
+0

的問題是,這不僅使擔保時,我得到一個承諾*傳入*我的圖書館,但我需要*產生承諾*。假設我將藍鳥與我的圖書館捆綁在一起以產生這些承諾。即使我的用戶可以很容易地將它們轉換爲代碼中的Q promise,但他們仍然需要通過電話將Bluebird發送給他們的客戶端,這是非常重要的。 ---我希望找到一些最小的代碼來產生承諾,無論哪個承諾庫正好加載。 – mhelvens 2014-10-06 13:35:07

+0

@mhelvens你可以在初始化你的庫的時候向他們請求一個承諾構造函數作爲參數,或者你可以從'然後'發出一個空承諾。然而 - 關鍵在於沒有必要,因爲無論如何,它們都可以與Q的Bluebird承諾進行互操作,反之亦然。 – 2014-10-06 14:00:10

+0

@mhelvens我已經添加了更直接的答案 - 但更重要的一點是A +承諾規範。讓我知道這是否是你的意思。 – 2014-10-06 14:11:26