什么';这就是Javascript之间的区别;“承诺”;和函数式编程';s";任务;?

什么';这就是Javascript之间的区别;“承诺”;和函数式编程';s";任务;?,javascript,promise,task,Javascript,Promise,Task,除了懒惰的执行,任务和承诺是不是差不多? 当我提到一个任务时,我指的是一个具有如下最基本行为的类: class Task { constructor(then) { this.then = then; } map(mapper) { return new Task((resolve, reject) => this.then( x => resolve(mapper(x)), reject )) } flatMap(

除了懒惰的执行,任务和承诺是不是差不多? 当我提到一个任务时,我指的是一个具有如下最基本行为的类:

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
    ))
  }
}

什么类型的(类?)是任务/承诺?我正在学习函数式编程方法,但我认为我还没有接触到这种类型。它是单子的一种吗

是的,关键是一元绑定,或者在您的情况下是一个具有签名的
flatMap

Task A -> A -> Task B -> Task B
有承诺-这就是
然后
方法:

Promise A -> (A -> Promise B) -> Promise B
 this          onFulfilled        return value
事实上,这两种情况都是类似的。许多其他东西(如Rx流)都是延续单子的实例

然而,JavaScript中的承诺使用了稍微不同的(而且更丑陋,因为可以说是实际原因)签名,可以从
然后
返回一个普通值,并且涉及异常语义


早在2013年,就有人提出了更多的“一元”承诺,但失败了。JavaScript中当前的承诺本身并不是真正的“monad”。A.承诺是比回调更进一步的重构步骤。仅此而已。 如果你有一个函数

const f = x =>  x * x ;
1) 使用回调并删除返回类型

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

const f1 = (x,callback)=>callback(x*x);
如果我们做了一件事,结果却把它退回去怎么办?!我们可以这样做:

const squareCont = (x)=>callback=>callback(x*x);
如果您长时间看这个问题并重命名callback以解决问题,您将看到这实际上是一个承诺。

//i rewrited it to make it clearer
var squareCont = function(x){
   return function (resolve){return resolve (x*x);}
}
[旁注:如果我们将回调封装到一个对象中,该对象公开了一个then函数,那么我们可以将它变成一个承诺:

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

squarePromise(2).then(r=>console.log(r))
检查小提琴B。任务是共分音单子。因为我不能在这里对其进行总结,您可以在这里阅读更多详细信息: 这里呢

意味着共享计算和结果,而您的
任务
实现却没有。在我看来,它就像
承诺的
单子一样。(是的,它也是一个单子,正如它的
flatMap
方法所暗示的那样,但是它缺少
/
返回
方法的
)读了这篇文章,我觉得这篇文章提供了很多信息:我的错,我的意思是使用类似fork的东西延迟执行。当然,在我的任务的基本表示中,这不是一种方法。我假设任务也没有内部的“挂起”/“完成”状态就像承诺一样吗?@MFave为什么你会这么认为?如果你是指任务,那么它就有状态。这只是我对这些东西如何工作的天真态度。它与函数式编程的“尽可能无状态”相伴而来某种方法,但我想在这种情况下你无法避免。这并不能回答OP的问题。你甚至都没有试图描述承诺和任务之间的区别。此外,承诺不是一个
Cont
。它比这复杂得多,因为承诺的价值可能不容易获得。因此,您必须维护一个侦听器列表,以便在值最终可用时进行更新。最后,您链接到的Lazy的comonad实现不遵循comonad的规则。@AaditMShah谁说承诺是Cont???请参阅本文以了解Lazy为什么可以形成co monad。谢谢@AaditMShah您不能有一个承诺的侦听器列表,因为只有一个解决方案。您谈论的是观察者模式,它是由反应式扩展中的observate/observator实现的。请不要回答不相关的未知信息,只是为了给人留下印象。@AaditMShah请参阅此处关于承诺的讨论o打破承诺,每个承诺只能有一个承诺。你评论道:“这比承诺要复杂得多,因为承诺的价值可能不容易获得。”您所指的观察者模式实际上非常简单,如果您认为它很复杂,那么您可能需要更深入地阅读,直到您掌握它。谢谢您说过承诺是一个
Cont
,我引述,“如果您长时间看这一点并重命名callback以解决问题,您将看到这实际上是一个承诺。”不,这实际上不是一个承诺。另外,我知道我在说什么,因为我实际上写了一个。最后,你确实需要维护一个侦听器列表,因为虽然一个承诺只能解决一次,但是多个侦听器可以等待承诺得到解决。