Javascript和#34; Promises"之间的区别是什么?和功能编程"任务"?

时间:2017-10-30 03:47:45

标签: javascript promise task

除了懒惰执行之外,Tasks和Promises几乎是一回事吗? 当我提到一个任务时,我指的是一个最基本的行为,如下所示:

class Task {
  constructor(then) {
    this.then = then;
  }
  map(mapper) {
    return new Task((resolve, reject) => this.then(
      x => resolve(mapper(x)),
      reject
    ))
  }
  flatMap(mapper) {
    return new Task((resolve, reject) => this.then(
      x => mapper(x).then(resolve, reject),
      reject
    ))
  }
}

什么类型的(类?)是任务/承诺?我正在学习函数式编程方法,但我不认为我已经达到了这种类型。它是一种monad吗?

2 个答案:

答案 0 :(得分:3)

是的,关键是monadic绑定,或者你的案例中有flatMap签名:

Task A -> A -> Task B -> Task B

使用承诺 - then方法:

Promise A -> (A -> Promise B) -> Promise B
 this          onFulfilled        return value

事实上,两者都是Continuation Monad的实例。许多其他东西(如Rx流)是continuation monad的实例。

然而,JavaScript中的Promise具有稍微不同(并且更为丑陋,因为可论证的实际原因)签名,并且还可以从then返回普通值,并且涉及异常语义。

推动更多" monadic"在他们被推测时,它在2013年有所承诺,但它失败了。 JavaScript目前的承诺并不是真正的monad"本身。

答案 1 :(得分:1)

A. 承诺是比回调更进一步的重构步骤。 如果您有功能

const f = x =>  x * x ;

1)使用回调并删除返回类型

您可以传递回调并删除返回类型。这就是著名的Continuation-passing风格

const f1 = (x,callback)=>callback(x*x);

如果我们命令该操作并返回结果怎么办?我们可以这样做:

const squareCont = (x)=>callback=>callback(x*x);

如果您长时间查看此内容并重命名回调以解决,您会发现这实际上是一个承诺。

//i rewrited it to make it clearer
var squareCont = function(x){
   return function (resolve){return resolve (x*x);}
}

[附带说明:如果我们将回调包含在一个暴露了then函数的对象中,那么我们可以把它变成Promise:

const squarePromise = (x)=>({then:callback=>callback(x*x)});

squarePromise(2).then(r=>console.log(r))

检查小提琴here] B。任务是 Coninuation Co-Monad 。由于我无法在此处进行总结,因此您可以在此处详细了解:Promises & Continuation Monad in JavaScript 和这里 Async/await a.k.a Continuation Co- Monad in JavaScript