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

如何使JavaScript库与多个promise库兼容?,promise,javascript,Promise,Javascript,我正在写一个图书馆,它应该能够提供承诺。但我不想将我的库的用户绑定到任何特定的promise实现。假设我不会使用任何外来的/特定于实现的特性,那么有没有既定的最佳实践可以做到这一点 例如,是否有一个最小兼容性库来检测Q、Bluebird、AngularJS承诺、ES6承诺。。。加载,并为我提供一个最小的接口,无论它是什么 注意:我的库需要产生承诺,我希望避免在我自己的库中捆绑一个完整的承诺库。(除非有一个特别小的,专门用于此目的的?出于这个原因-有承诺/a+规范 是一种仅定义then方法的承诺规

我正在写一个图书馆,它应该能够提供承诺。但我不想将我的库的用户绑定到任何特定的promise实现。假设我不会使用任何外来的/特定于实现的特性,那么有没有既定的最佳实践可以做到这一点

例如,是否有一个最小兼容性库来检测Q、Bluebird、AngularJS承诺、ES6承诺。。。加载,并为我提供一个最小的接口,无论它是什么


注意:我的库需要产生承诺,我希望避免在我自己的库中捆绑一个完整的承诺库。(除非有一个特别小的,专门用于此目的的?

出于这个原因-有承诺/a+规范

是一种仅定义
then
方法的承诺规范。它描述了不同的promise库之间如何进行互操作——有效地满足您描述的目的

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

您描述的最小接口已经存在,它是
然后
。或者,如果您需要直接创建自己的承诺-您可以从该列表中选择任何一个承诺/A+库,并且您可以保证它将在所有其他库中工作-因为它们都是承诺/A+它们将正确地吸收承诺。它还可以在库的不同版本之间工作(减去bug)

如果您在应用程序中选择Promises/a+库,例如Bluebird,则用户可以使用

这是。如果您确实希望能够从头开始创建承诺-您可以要求用户向您的库提供其同化方法-例如:

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; });  });

问题是,只有当我的承诺被传递到我的库中时,这才有保证,但我需要做出承诺。比如说,我把蓝鸟和我的图书馆捆绑在一起,以实现这些承诺。即使我的用户可以轻松地将它们转换为代码中的Q承诺,他们仍然需要通过网络将Bluebird发送给他们的客户,这是非常重要的我希望找到一些最小的代码来生成承诺,无论哪个承诺库碰巧被加载。@mElvens您可以在初始化库时要求他们提供一个承诺构造函数作为参数,或者要求他们提供一个空承诺,您可以
然后
。然而-关键是这不是必要的,因为他们可以与Q的蓝鸟承诺进行互操作,反之亦然。@mElvens我添加了一个更直接的答案-但这里更重要的一点是a+承诺规范。如果这是你的意思,让我知道。啊,通过同化器方法是聪明的!我现在使用一个类似的初始化方案,但要求“主库对象”,然后根据API区分大小写。但是用同化器的方法,我几乎可以去任何地方。谢谢PS:是的,你答案中的承诺/A+规范部分肯定是更重要的一点。我只是碰巧已经知道了这一点,我需要这最后的提示来说明我的特殊情况。整体回答很好!