除了懒惰执行之外,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吗?
答案 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