续之前的一篇: 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 支持)