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

How to make a JavaScript library compatible with multiple promise libraries?

本文关键字:promise 何使 JavaScript      更新时间:2023-09-26

我正在编写一个应该能够生成promise的库。但我不想将库的用户绑定到任何特定的promise实现。假设我不会使用任何外来的/特定于实现的功能,那么有没有既定的最佳实践可以做到这一点?

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

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

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

Promises/A+是一个仅定义then方法的promise规范。它描述了不同的promise库如何相互操作——有效地满足您所描述的目的。

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

您所描述的最小接口是存在的,它就是then。或者,如果您需要直接创建自己的promises-您可以从该列表中选择任何一个promises/A+库,并且保证它将在所有其他库中工作-因为它们都是promises/A+,所以它们将正确地吸收promises。它还可以在不同版本的库之间工作(减去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; });  });