为什么JS承诺A +创建/履行/拒绝不属于规范的一部分?

Seb*_*ber 3 javascript promise jquery-deferred q rsvp.js

http://promisesaplus.com/

最后,核心Promises/A +规范没有涉及如何创建,实现或拒绝承诺,而是选择专注于提供可互操作的方法.配套规范中的未来工作可能涉及这些主题.

作为一个功能开发人员,我通常会处理monad和operator之类的操作,point bind map或者flatMap链接一些包含在monad框内的调用.

根据这个问题的js递延/无极/未来相比,比如Scala函数式语言,在mapflatMap运营商似乎在融化在一起then的JS规范,可能是因为它不会赚那么多有意义的像的JS动态类型语言同时提供(?)并且使用和记住单个操作符更方便.


到目前为止一直很好,有一个then运营商(似乎并不总是正确实施)

但为什么承诺创建/履行/拒绝不是规范的一部分?这就像只有半个monad :( 似乎我不是唯一抱怨的人

通常,我的问题是:

  • 我想创建一个JS库
  • 我想公开一个基于promise的API
  • 我希望客户端选择他想要使用的promise实现

那我该怎么办?

我可以在我的图书馆里创建承诺

Q.fcall(function () {
    return 10;
})
Run Code Online (Sandbox Code Playgroud)

好的很酷,我只是将我的库耦合到Q :(

那么,这个问题有什么解决方案吗?库作者如何创建他暴露给API的承诺而不与实现相结合?

是否有一些免许可证的最低可行承诺A +库可以嵌入我们的库或其他东西?

这个规格选择背后的原因是什么?

Dom*_*nic 5

这个规格选择背后的原因是什么?

正如Ben在评论中指出的那样,Promises/A +规范的想法不是提供某种库API.它提供了一组最小的可互操作原语,这样任何消费承诺的人都可以依赖它具有统一的接口.这对于跨库互操作尤其重要,例如在应用程序的不同组件的接缝处,其中可能在内部使用不同的promise库.为实现此目标,实际上不需要为promise库指定完整的API.

是否有一些免许可证的最低可行承诺A +库可以嵌入我们的库或其他东西?

许多Promises/A +实现.我不认为它们中的任何一个都是免许可证的,这是一件好事,因为它们默认是作者保留的所有权利.但是,大多数(全部?)都是开源许可的,应该没问题.

库作者如何创建他暴露给API的承诺而不与实现相结合?

我真的不明白这是怎么可能的.如果你改写这个问题,你会问,"如何在不使用承诺实施的情况下创建承诺?" 这简直不可能.

  • 我想公开一个基于promise的API
  • 我希望客户端选择他想要使用的promise实现

另一方面,这个目标是另一回事.如果您想让人们选择承诺实施,那么有几个简单的选择.

首先,回报任何实施的承诺; 消费者可以使用他们的库的强制方法将其转换为他们喜欢的.例如,如果你的图书馆返回了一个承诺,而我,消费者,想要一个Q承诺,我可以做Q(yourLibrary.getPromise()).

或者,您可以允许任何遵循Promises/A +构造函数proto-spec的库.这在很大程度上是一个事实上的标准; 大多数主要的库,包括ES6中的承诺,都遵循该规范.例如,您可以允许用户执行yourLibrary.Promise = Q.Promise,然后在库中使用指定的promise构造函数来创建promise.