【问题标题】:How to make a JavaScript library compatible with multiple promise libraries?如何让一个 JavaScript 库兼容多个 Promise 库?
【发布时间】:2023-04-02 09:12:01
【问题描述】:

我正在编写一个应该能够产生承诺的库。但我不想将我的库的用户绑定到任何特定的承诺实现。假设我不会使用任何外来/实现特定的功能,是否有既定的最佳实践来做到这一点?

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

注意:我的库需要产生 Promise,我想避免在我自己的库中捆绑完整的 Promise 库。 (除非有一个特别小的,专门为此做的?)

【问题讨论】:

    标签: promise javascript


    【解决方案1】:

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

    Promises/A+ 是一个仅定义then 方法的承诺规范。它描述了不同的 Promise 库如何相互操作——有效地服务于您描述的目的。

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

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

    如果您在应用中选择 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传入我的库时,它才能保证,但我需要produce promises。假设我将 Bluebird 与我的库捆绑在一起以产生这些承诺。即使我的用户可以轻松地将它们转换为代码中的 Q 承诺,他们仍然需要通过网络将 Bluebird 发送给他们的客户,这是非常重要的。 --- 我希望能找到一些最小的代码来生成 Promise,无论哪个 Promise 库恰好被加载。
    • @mhelvens 你可以在初始化你的库时要求他们提供一个 Promise 构造函数作为参数,或者你可以从 then 获得一个空的 Promise。但是 - 关键是这不是必需的,因为它们可以与 Q 的 Bluebird Promise 无缝交互,反之亦然。
    • @mhelvens 我添加了一个更直接的答案 - 但这里更重要的一点是 A+ 承诺规范。让我知道这是否是您的意思。
    • 啊,通过同化器方法很聪明!我现在使用类似的初始化方案,但要求“主库对象”,然后根据 API 区分大小写。但是使用同化方法,我几乎可以去任何地方。谢谢!
    • PS:是的,您的答案中的 Promises/A+ 规范部分绝对是更重要的一点。我只是碰巧已经知道了,我需要针对我的特殊情况的最后提示。总体来说很好的答案!
    猜你喜欢
    • 2016-01-27
    • 2011-03-22
    • 1970-01-01
    • 1970-01-01
    • 2010-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-14
    相关资源
    最近更新 更多