es6 generator and promise

续之前的一篇: continuation,cps,说下 promise 以及 es6 下对于嵌套回调的解决方案。

传统的嵌套回调


function processData(d){

    // process final data

}

searchUser('name',function(userId){

    getUserInfo(userId,function(userData){

        processData(userData);

    });

});

转化为 promise

searchUser 和 getUserInfo 均返回 promise


searchUser('name').then(function(userId){

    return getUserInfo(userId)

}).then(function(data){

    processData(data);

});

可见虽然消除了嵌套回调,但是相对于其他语言的阻塞式编程范式仍显啰嗦,不直观:

其他语言的阻塞式


int userId = searchUser(name);

UserInfo inf0 = getUserInf(userId);

processData(info);

但这种做法却是对性能的牺牲。

es6 generator

而 es6 支持 generator 后,结合 promise 可十分轻易达到类似的效果,这里使用 promise 提供的 async 方法,不使用 promise 的话可用 co


promise.when(promise.async(function *go(){

    var userId= yield searchUser(name);

    var info= yield getUserInf(userId);

    return info;

})(),function(data){

    processData(data);

},function(e){

    throw e;

});

demo

打开控制台后访问: 单纯使用 promise 对比 promise and generator(chrome 需打开 harmony 支持)

Advertisements

发表评论

Fill in your details below or click an icon to log in:

WordPress.com 徽标

You are commenting using your WordPress.com account. Log Out /  更改 )

Google photo

You are commenting using your Google account. Log Out /  更改 )

Twitter picture

You are commenting using your Twitter account. Log Out /  更改 )

Facebook photo

You are commenting using your Facebook account. Log Out /  更改 )

Connecting to %s