13

我真的很喜欢 jQuery 的延迟/承诺模式或范式的想法,但有时我很难将老化的大脑包裹在更精细的点或特定的实现细节上。

事实上,最近我发现延迟/承诺模式/范式似乎早于 jQuery,并且至少在这些其他 JavaScript 库/框架中也存在:

我可能错过了一些,包含的东西确实是其他人的一部分,并在该列表中犯了其他错误......请编辑它以更正它或发表评论。

延期/承诺的概念是“Q”发明的吗?它是与其他 JavaScript 库或框架一起发明的吗?还是它完全早于 JavaScript?

如果整个想法传统上是函数式编程的一部分,那么它首先是在哪里完成的,我可以在哪里阅读一般性的概念,而不是这些不同的 JavaScript 实现?

还是函数式编程完全不重要?这个概念与并发编程比与函数式编程更相关吗?

4

2 回答 2

9

根据维基百科承诺一词是由 Daniel P. Friedman 和 David Wise 于 1976 年提出的,Peter Hibbard 称之为最终。1977 年,Henry Baker 和 Carl Hewitt 在一篇论文中引入了一个有点类似的未来概念。

请参阅: 维基百科上的期货和承诺历史:

future 和/或 promise 构造首先在 MultiLisp 和 Act 1 等编程语言中实现。在并发逻辑编程语言中使用逻辑变量进行通信与 future 非常相似。这些从带有 Freeze 和 IC Prolog 的 Prolog 开始,并通过关系语言、并发 Prolog、Guarded Horn Clauses (GHC)、Parlog、Vulcan、Janus、Mozart/Oz、Flow Java 和 Alice ML 成为真正的并发原语。来自数据流编程语言的单赋值 I-var,源自 Id 并包含在 Reppy 的并发 ML 中,非常类似于并发逻辑变量。

承诺流水线技术(使用期货来克服延迟)由 Barbara Liskov 和 Liuba Shrira 于 1988 年发明,[12] 并由 Mark S. Miller、Dean Tribble 和 Rob Jellinghaus 在大约 1989 年的 Xanadu 项目的背景下独立发明。 [13]

术语 Promise 是由 Liskov 和 Shrira 创造的,尽管他们通过名称 call-stream 来指代流水线机制,现在很少使用。[...]

于 2012-08-07T11:54:27.353 回答
6

我认为 JavaScript 中的 deferred/promise 概念首先出现在Dojo中(受 Python 的Twisted启发),然后出现在jQuery中。

值得注意的时刻是 CommonJS 小组的工作,他们为 JavaScript 的“标准化”承诺付出了很多努力,参见ABD提案,在此基础上 Kris Kowal 的Q(我猜是目前最流行的实现)演变而来。

Deferred(我是作者)是后来的实现,它最初是受Q启发的,它的目标是让 Promise 在 JavaScript 中感觉自然,同时也让 Node.js 回调风格的转换变得容易。

但是是的,正如@rsp 所写,promise 是比 JavaScript 本身更古老的概念 :)

于 2012-08-07T18:56:17.267 回答