我主要使用Scala和JavaScript之类的编程语言。我试图了解两种语言如何使用异步反应式编程的异同。你能帮助我吗?
我没有采用任何特定的JsPromise
框架,因为似乎许多框架都实现了类似的规范(例如Promise / A)。到目前为止,我只使用过Q。
似乎在Javascript中,我们调用Deferred
解析为完成的对象Promise
。在Scala中,似乎Promise
是解析要获取Future
monad的对象。
有人可以告诉我这是否正确吗?是否有充分的理由Promise
在Js和Scala之间使用不同的术语?
此外,在Scala中,我们通常Future
使用诸如map
和flatMap
(bind
在Haskell中也称为)运算符将单子链与进一步的计算链接在一起。Js中的这些等效于什么?
我可能是错的,但在我看来,在JS中的then
一个Promise
种类同时处理的map
和flatMap
运营商吗?如果是这样,是否有可能获得promise of promise of result
in Js?就像我们可以Future[Future[Result]]
在Scala中获得一个(Future[Result]
无论如何都可以将其展平)。
JsPromise
是monad吗?即使方法名称与我们在monad文献中找到的方法名称不完全匹配,似乎也是如此。
虽然极为相似。使用符合Promises / A +规范的JavaScript Promises.then
并不是真正的一元绑定,.map
并且.flatMap
两者兼而有之。在.then
处理程序内部,当您返回承诺时,它将以递归方式解包。
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");
});
您是正确的,标准的JS Promise库和A +规范不包含Monadic Promise。已经讨论了它们,并且存在诸如幻想承诺之类的实现。他们遵循不同的网络规范,几乎没有采用。另请参阅此。在语言设计讨论论坛上一直在进行有关此问题的讨论-esdiscuss和一种.chain
不能实现平面图并允许monadic承诺的monadic方法已被考虑,但不太可能实现。
这是出于务实的原因。当前实现诺言的方式非常有用。实际需要的情况很少见Future[Future
,通常情况下,您只想继续使用该语言即可。从单子身上“借”,从某种意义上说是“单子”。.then
是非常接近的绑定,在我脑子里,我可以互换使用它们:)
在Scala中,大多数promise库都不可能有一个Promise[Promise[Value]]
像aFuture[Future[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
});
两者之间还有许多其他较小的区别,但是通常您的主张是正确的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句