问一个Promise写法
假如我有A,B,C 3个函数,处理流程如下
return A().then(function(dataA){
//这里通过A函数拿到的dataA,去做一些操作,假如是调B函数查数据
return B(dataA.id);
}).then(function(dataB){
//假如我这里要将A函数拿到的dataA里的name和B函数拿到dataB里的id去调C函数
//即 C(dataA.name,dataB.id),这里应该怎么弄,我能想到的就是一层层嵌套写了,但这样的话,和callback区别了
})
实际的业务中可能不止3个函数,可能会更多,而且后面的函数可能会用到前面函数的结果,逻辑上应该怎么写呢?
15 回复
我是用的Promise.all()
return A().then(function(dataA){
return B(dataA.id);
return Promise.all([
Promise.resolve(dataA),
B(dataA.id)
]);
}).then(function(results){
var dataA = results[0];
var dataB = results[1];
// 继续
})
在外面放一个变量吧. 如果用的是Bluebird, 可以用Promise.bind.
A().bind({}).then(function (a) {
this.a = a
return b
}).then(function (b) {
return b + this.a
})
return A().then(a => B(a).then(b => C(a, b)));
并不是一定不能嵌套,而是不要过深嵌套,关键在于可读性。你这种情形反而是嵌套一下更容易理解,一眼看过去就能知道 c 依赖于 a,b, b 依赖于 a。
return A().then(a => {
return B(a).then(b => {
return C(a, b);
});
});
@SinalVee 思路不错,代码好像写错了吧?
return A().then(function(dataA){
return Promise.all([
dataA,
B(dataA.id)
]);
}).spread(function(dataA, dataB){
return C(dataA, dataB);
})