Seb*_*ber 20 javascript scala future promise deferred
我主要使用Scala和JavaScript等编程语言.我试图理解在两种语言中如何使用异步响应式编程的相似点和不同点.你能帮助我吗?
我没有采用任何特定的Js Promise框架,因为它似乎很多实现了类似的规范(如Promise/A).到目前为止我只使用过Q.
似乎在Javascript中我们称之为Deferred我们解决的对象来完成一个Promise.在Scala中,似乎Promise是你决定获得Futuremonad 的对象.
有人可以告诉我这是对的吗?Promise在Js和Scala之间使用不同术语有什么好的理由吗?
此外,在Scala中,我们通常Future使用像(map和Haskell)这样的运算符进行进一步计算来链接monad .在Js中这些相当于什么?flatMapbind
我可能是错的,但在我看来,在JS中的then一个Promise种类同时处理的map和flatMap运营商吗?如果是这样,是否有可能获得一个promise of promise of resultin Js?就像我们可以Future[Future[Result]]在Scala中获得一个(Future[Result]无论如何都可以扁平化).
Js Promise是monad吗?即使方法名称与我们在monad文献中找到的名称不匹配,它似乎也是如此.
Ben*_*aum 36
虽然非常相似.使用符合Promises/A +规范的JavaScript Promise .then并不是真正的monadic绑定,.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");
});
Run Code Online (Sandbox Code Playgroud)
你是正确的,标准的JS承诺库和A +规范没有monadic承诺.他们已经讨论过,并且存在像幻想承诺这样的实现.他们遵循不同的规范,几乎没有采用.也看到这个.在语言设计讨论论坛上一直在讨论这个问题 - esdiscuss和monadic .chain方法没有平面图并允许monadic promises被考虑但不太可能成功.
这是出于务实的原因.实施当前的承诺方式非常有用.很少有你真正想要的案例Future[Future,通常你想继续只使用这种语言.承诺从单子"借",从某种意义上说是"monadic"..then是非常密切结合,在我脑子里,我可以互换使用它们:)
它是不可能有Promise[Promise[Value]]像Future[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
});
Run Code Online (Sandbox Code Playgroud)
两者之间还存在许多其他较小的差异,但通常你的断言是正确的.
| 归档时间: |
|
| 查看次数: |
3993 次 |
| 最近记录: |