promise使用请教
发布于 8 年前 作者 zjy01 3085 次浏览 来自 问答

之前在使用 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 😄

回到顶部