gpt4 book ai didi

javascript - Js Deferred/Promise/Future 与 Scala 等函数式语言相比

转载 作者:行者123 更新时间:2023-12-03 03:47:23 29 4
gpt4 key购买 nike

我主要使用 Scala 和 JavaScript 等编程语言。我试图了解两种语言中如何使用异步响应式(Reactive)编程的相似点和差异。你能帮我吗?

我没有采取任何特定的 Js Promise框架,因为似乎许多都实现了类似的规范(例如 Promise/A)。到目前为止我只使用过 Q。

<小时/>

似乎在 Javascript 中我们调用 Deferred我们决定完成Promise的对象。在 Scala 中,似乎 Promise是您决定获得 Future 的对象单子(monad)。

谁能告诉我这是否正确?对于术语 Promise 的不同用法有什么充分的理由吗? Js 和 Scala 之间?

<小时/>

此外,在 Scala 中我们通常链接 Future使用 map 等运算符进行进一步计算的 monad和flatMap (在 Haskell 中也称为 bind)。这些在Js中相当于什么?

我可能是错的,但在我看来,在 Js 中 thenPromise上两者都可以处理mapflatMap运营商对吗?如果是这样,是否可以获得 promise of promise of result在 Js 中?就像我们可以获得 Future[Future[Result]]在 Scala 中(无论如何都可以扁平化为 Future[Result])。

<小时/>

是 Js Promise一个单子(monad)?即使方法名称与我们在 monad 文献中找到的名称并不真正匹配,似乎也是如此。

最佳答案

是,又不是。

虽然极其相似。对于符合 Promises/A+ 规范的 JavaScript Promises,.then 并不是真正的单子(monad)绑定(bind),并且 .map.flatMap 两者都可以。在 .then 处理程序中,当您返回 Promise 时,它​​会递归地解开它。

Promise.delay(1000).then(function() {
return Promise.delay(1000).then(function () {
return Promise.delay(2000);
}).then(function () {
return Promise.delay(5000)
});
}).then(function () {
alert("This is only shown after 8 seconds and not one");
});

(fiddle)

你是对的,标准 JS Promise 库和 A+ 规范不具有 Monadic Promise 功能。它们已经被讨论过,并且实现如 fantasy-promises存在。它们遵循不同的规范并且很少被采用。另请参阅this 。在语言设计讨论论坛中一直有关于它的讨论 - esdiscuss 和一个不进行平面映射并允许一元 promise 的一元 .chain 方法被考虑过,但不太可能实现。

这是出于务实的原因。目前的 promise 实现方式非常有用。在极少数情况下,您实际上想要一个 Future[Future,并且通常您希望延续仅在该语言中工作。 Promise 是从 monad 中“借用”的,并且在某种意义上本身就是“monadic”。 .then 非常接近于绑定(bind),在我看来,我可以互换使用它们:)

对于大多数 Promise 库来说,在 Scala 中不可能有像 Future[Future[Value]] 这样的 Promise[Promise[Value]] 。您必须将其包装在一个对象中并拥有 Promise[Container[Promise[Value]]]

Promise.delay(1000).then(function () {
return Promise.delay(1000).then(function () {
return {
wrap: Promise.delay(2000).then(function () {
return Promise.delay(5000);
})
};
});
}).then(function () {
alert("This logs after 1 second");
// I've also not seen a really solid use case
// except TypeScript type inference which is meh
});

(fiddle)

两者之间还存在许多其他较小的差异,但通常您的断言是正确的。

关于javascript - Js Deferred/Promise/Future 与 Scala 等函数式语言相比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22724883/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com