promise - 如何让一个 JavaScript 库兼容多个 Promise 库?

标签 promise javascript

我正在编写一个应该能够产生 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/

相关文章:

javascript - angular.copy 不复制具有子对象或数组的对象

javascript - 如何从递归请求返回 promise 并在数据匹配条件时解决它?

javascript - 如何匹配多个序列

javascript - 如何使用新数组更新 Promise.all?

javascript - 如何等待Firebase存储图像上传,然后运行下一个函数

javascript - Angularjs promise 未在 Controller 中解决

javascript - 如何使用 fullcalendar 事件作为变量?

javascript - ReactJS 教程 - 评论表单未发布到本地服务器

javascript - "Iterating"throw Promise 不允许生成不同的 id

javascript - 未捕获( promise )SyntaxError : Unexpected end of input after json fetch