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