我想知道是否有办法在平坦的承诺中转变连锁承诺。我有这样的代码:如何在Q和TypeScript中将连锁承诺变成公平承诺
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放在承诺的向量中,甚至可以创建另一个向量并在第一个内部等待它Q.all ...但它不是一个明确的代码,我想知道是否有一个更好的方法。
非常感谢!
你是对的。在我原来的代码中,方法B和C从未被调用过。我的问题是,在这个链中,方法B和C只需要根据父承诺的结果进行调用,所以我需要大括号将一些“if”放入其中。我会用更真实的代码更新我的问题。谢谢! –
@VladimirVenegas:以上允许'methodB'使用'methodA'的结果,并允许'methodC'使用'methodA'和'methodB'的结果。唯一不在链中的(并行)是'methodD'。 –