cc98-frontend-development / dummy_backend

The dummy back end provides a reference API for front end testing and real back end implementation.
GNU General Public License v2.0
0 stars 0 forks source link

About promise/A+ #1

Open jamesruan opened 10 years ago

jamesruan commented 10 years ago

A+的定义已经比A简化了不少了,但是A+里面对onFulfilled, onRejected的类型设置地太宽泛,导致要实现then需要走一个比较复杂的流程。 如果把onFulfilled, onRejected的类型限定为一个函数(A+定义允许这种形式),其形式为:

function(a){
    return(function(resolve, reject){
        //something to do about a
        return resolve(new_value);
       //or return a reject(error);
    });
}

则then的流程就可以简化。

然后我试着实现了这个严格版的promise,

http://jamesruan.github.io/#/blog_promise_is_a_monad.ml.js

GhostFlying commented 10 years ago

Win下没环境,没跑,不过看起来没啥问题,不过这种实现下异步返回可能需要在function内部处理,不过问题也不大。

jamesruan commented 10 years ago

Monad就是用来做副作用隔离和保证顺序执行的。在Pure Functional里面,大量的语句都是可以并行的,保证顺序性除了最常用直接调用外,还有CPS( Continuation passing Style ),或者直接使用Monad(比如haskell里提供了Monad的语法糖:do)。

在异步环境中,也可以使用Monad。或者用CPS也是不错的选择(CPS适合于顺序执行的操作很相似的时候)

GhostFlying commented 10 years ago

我用你的monad改写了下,然后接下来我有时间再试着往functional改写

jamesruan commented 10 years ago

额,我那个有写问题的,在同步环境下使用是OK的,但是不知道怎么使用异步函数。这个Monad的原理是确认上一个函数的结果返回后调用下一个函数。异步环境小怎么用我还没搞清楚。

jamesruan commented 10 years ago

简单的看了下,目前似乎都是对同一个req的多次同步函数调用,这样使用这个monad是没有问题的。

GhostFlying commented 10 years ago

嗯,我重新看了下,发现昨天写的时候有点想茬了,以为异步直接嵌回调进去就行。

这几天我再去看下吧。