Js延期/承诺/未来与Scala等功能语言相比

我主要使用Scala和JavaScript等编程语言。 我试图理解在两种语言中如何使用异步响应编程的相似之处和不同之处。 你可以帮我吗?

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


似乎在JavaScript中,我们称之为Deferred了我们决心完成Promise的对象。 在Scala中, Promise似乎是你决心获得Future monad的对象。

有人可以告诉我这是对的吗? 在Js和Scala之间使用Promise这个术语有什么不同的理由吗?


另外,在Scala中,我们通常使用诸如mapflatMap类的运算符(也称为Haskell中的bindbind Future monad连接到进一步的计算中。 这些在Js中的等价物是什么?

我可能是错的,但在我看来,在Js中, then PromisemapflatMap操作符都是正确的? 如果是这样,是否有可能在Js中获得promise of promise of result ? 就像我们可以在Scala中获得Future[Future[Result]] (无论如何都可以将其展平为Future[Result] )。


Js Promise一个monad? 即使方法名称与我们在monad文献中找到的方法名称不匹配,情况似乎也是如此。


是,不是。

虽然非常相似。 使用JavaScript承诺,遵守的承诺/ A +规格.then是不是一个真正的单子绑定和不.map.flatMap两者。 当你返回一个承诺时.then在一个.then处理程序里面.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承诺库和A +规范没有提供monadic承诺是正确的。 他们已经被讨论过,像幻想承诺这样的实现存在。 他们遵循不同的规范,很少有人接受。 也看到这个。 在语言设计讨论论坛上一直在讨论这个问题 - esdiscuss和.chain方法没有平面地图并且允许monadic promise被认为是不可能做到的。

这是出于实用的原因。 目前的做法承诺是非常有用的。 罕见的情况下,你实际上想要一个Future[Future ,通常你想继续只是用语言工作。 承诺从monad中'借用',在某种意义上是'monadic'。 .then是非常接近绑定,并在我的头,我互换地使用它们:)

在大多数承诺库中,不可能有像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
});

(小提琴)

两者之间还有其他一些较小的差异,但一般而言,您在断言中是正确的。


似乎在JavaScript中,我们称之为推迟了我们解决的对象>完成一个Promise。 在Scala中,Promise似乎是您决心获得Future monad的对象。

有人可以告诉我这是对的吗? 在Js和Scala之间使用Promise这个术语有什么不同的理由吗?

在Scala中,Promise和Future具有分离的功能,Future是一个异步计算容器,将来会为您带来一些价值,而Promise是异步计算的写作部分,您可以按照以下方式进行操作

val promise = Promise[String]
val future1 = promise.future
val future2 = future1.map { case s => println(s); s }

future2.onSuccess { case s => println(s + " 2nd time") }

promise.success("promise completed")

一旦你执行了最后一条语句,输出将会是

promise completed
promise completed 2nd time

在Scala中,您可以使用onComplete从Future中读取值,或者使用map链接它,然后使用它的Promise副本写入Future

在JS无极A +规格,它们捆绑在一起, Promise.then同时用于链接和检索值的副作用(如执行console.log),写你会用resolve像下面的代码片段

var promise = new Promise(function(resolve, reject){
    Thread.sleep(10000);
    resolve("promise completed");
}

我试图理解在两种语言中如何使用异步响应编程的相似之处和不同之处。

这里的文档没有比较JavaScript承诺和Scala,而是用C ++ C#和Python承诺:https://github.com/KjellSchubert/promise-future-task。 我知道那不是你所要求的,但这可能会给你一些有趣的指示。

链接地址: http://www.djcxy.com/p/9441.html

上一篇: Js Deferred/Promise/Future compared to functional languages like Scala

下一篇: Making Async AJAX calls Synchronous