promise使用请教
之前在使用 mongoose 的时候因为回调问题在社区请教了各位, 根据回答使用了 promise。问题大体时 如何在两个异步都回调后运行某一个函数 比如我有3个操作
getA(){}//从mongodb中获取A
getB(){}//从mongodb中获取B
countAB(){}// 对A和B操作
原本我是这样写的
getA(function(){
getB(function(){
countAB();
})
});
后来使用promise后,变成了下面这样
Promise.all([getA(),getB()])
.then(function(data){
countAB(data);
});
当前,这对我来说的巨大的进步,免去了多次嵌套。 但是,如果遇到更加复杂一点的情况呢? 比如
getA(){}//从mongodb中获取A
getB(){}//从mongodb中获取B
getCfromA(){}//根据A从mongodb中获取C
getDfromB(){}//根据B从mongodb中获取D
countCD(){}// 对C和D操作
那么我的操作是
Promise.all([getA(),getB()])
.then(function(data){
Promise.all([getCfromA(data[0]), getDfromB(data[1])])
.then(function(data){
countCD()
})
});
事实上,我要做的操作更加麻烦,我又不可避免进入无限的回调嵌套之中。 想请问我是不是使用promise的方法不对,有没有更好使用promise的方法。
4 回复
Promise.all([getA(),getB()])
.then(function(data){
return Promise.all([getCfromA(data[0]), getDfromB(data[1])])
})
.then(function(data){
countCD()
});
Promise 会自动接受 Thenable 的返回值并执行。
事实上,我要做的操作更加麻烦,我又不可避免进入无限的回调嵌套之中。
Yeah. 单纯使用 promise我也觉得会这样 ~ So, 我是一开始就搭配 generator 使用, long long ago 写过一篇博客 http://magicdawn.ml/2015/01/10/generator-and-promise/ 现在讲这个的文章挺多的, 可以搜下
可参考NodeClub用的 EventProxy 😄