我正在编写一个应该能够产生 promise 的库。但我不想将我的库的用户绑定(bind)到任何特定的 promise 实现。假设我不会使用任何外来/特定于实现的功能,是否有已建立的最佳实践来执行此操作?
例如,是否有一个最小的兼容性库可以检测 Q、Bluebird、AngularJS Promise、ES6 Promise...是否已加载,并为我提供一个最小的接口(interface)?
注意:我的库需要产生 promise ,并且我希望避免在我自己的库中捆绑完整的 promise 库。 (除非有一个特别小的,专门为此目的而制作的?)
最佳答案
因此,出现了 Promises/A+ 规范。
Promises/A+是一个仅定义 then
方法的 promise 规范。它描述了不同的 Promise 库如何相互操作 - 有效地准确地服务于您所描述的目的。
您描述的所有这些库 - Bluebird、Q 和 AngularJS 的 $q 实际上都是 A+ promise ,并且都针对测试套件运行。
您所描述的最小界面是存在的 - 它就是then
。或者,如果您需要直接创建自己的 Promises - 您可以从该列表中选择任何一个 Promises/A+ 库,并且保证它将在所有其他库中工作 - 因为它们都是 Promises/A+ 他们会正确理解 promise 。它还可以在不同版本的库之间工作(减去错误)。
如果您选择 Promises/A+ 库,例如应用程序中的 Bluebird - 用户可以使用 any conformant implementation 。
这里是the suite 。如果您确实希望能够从头开始创建 promise - 您可以要求用户向您的库提供他们的同化方法 - 例如:
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; }); });
关于promise - 如何让一个 JavaScript 库兼容多个 Promise 库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26216636/