我想知道是否有一种方法可以将连锁经营的承诺转化为统一的承诺。我有以下代码:
import * as Q from 'q';
export class MyClass {
private methodA(): Q.Promise<boolean> {
let deferred = Q.defer<boolean>();
//some stuff, like database calls, etc
return deferred.promise;
}
private methodB(): Q.Promise<boolean> {
let deferred = Q.defer<boolean>();
//some stuff, like database calls, etc
return deferred.promise;
}
private methodC(): Q.Promise<boolean> {
let deferred = Q.defer<boolean>();
//some stuff, like database calls, etc
return deferred.promise;
}
private methodD(): Q.Promise<boolean> {
let deferred = Q.defer<boolean>();
//some stuff, like database calls, etc
return deferred.promise;
}
run(): Q.Promise<boolean> {
let deferred = Q.defer<boolean>();
let promises = [];
promises.push(this.methodA().then(wasOk => {
this.methodB().then(wasOk => {
this.methodC();
});
}));
promises.push(this.methodD());
//Wait all promises
Q.all(promises).then(wasOk => deferred.resolve(wasOk));
return deferred.promise;
}
}
这段代码有一个问题:Q.all只在等待methodA和methodD;并且不等待methodB和methodC。
我想我需要将方法B和C放在promises的向量中,甚至创建另一个向量,然后在第一个Q.all中等待它……但这不是一个清晰的代码,我想知道是否有更好的方法。
非常感谢!
最佳答案
您只是在return
上的then
处理程序中,可能是在methodA
处理程序中缺少了then
,因为您使用的是详细的箭头函数:
promises.push(this.methodA().then(wasOk => {
return this.methodB().then(wasOk => {
//^^^^^^^
return this.methodC();
// ^^^^^^^
});
}));
或具有简洁的箭头功能:
promises.push(this.methodA().then(wasOk => this.methodB().then(wasOk => this.methodC())));
或带有带换行符的简洁箭头:
promises.push(this.methodA().then(wasOk =>
this.methodB().then(wasOk =>
this.methodC()
)
));
请注意该代码执行此操作:
调用
methodA
并等待其解析,然后调用
methodB
并等待其解析,然后呼叫
methodC
因此,总的来说,数组中的第一个承诺要等到
methodB
和methodC
解析后才能解决; methodD
立即被调用,因此可以尽快解决。数组构造也可能更简单:
promises = [
this.methodA().then(wasOk =>
this.methodB().then(wasOk =>
this.methodC()
)
),
this.methodD()
];