如何使JavaScript库与多个promise库兼容?

时间:2014-10-06 12:52:16

标签: promise javascript

我正在写一个应该能够产生承诺的库。但我不想将我的库的用户绑定到任何特定的promise实现。假设我不会使用任何异国情调/实现特定功能,是否已建立最佳实践?

例如,是否有一个最小的兼容性库,可以检测Q,Bluebird,AngularJS是否承诺,ES6承诺......是否已加载,并为我提供了一个最小的接口,以便它可能是什么?

注意:我的库需要生成promises ,我想避免在我自己的库中捆绑一个完整的promise库。 (除非有一个特别小的,为此目的?)

1 个答案:

答案 0 :(得分:2)

出于这个原因 - 有Promises / A +规范。

Promises/A+是一个承诺规范,它只定义then方法。它描述了不同的promise库如何相互操作 - 有效地完全满足您描述的目的。

您描述的所有这些库--Bluebird,Q和AngularJS的$ q实际上都是A +承诺,并且都是针对测试套件运行的。

您描述的最小界面存在 - 它是then。或者,如果您需要直接创建自己的承诺 - 您可以从该列表中选择任何一个Promises / A +库,并且保证它将适用于所有其他库 - 因为它们是'所有Promises / 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; });  });