我想知道是否有办法在一个单一的承诺中改变连锁店的承诺。我有这段代码:
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只等待方法A和方法D;而不是在等待methodB和methodC。
我想我需要将方法B和C放在promises的向量中,或者甚至制作另一个向量并在第一个Q.all中等待它...但它不是一个清晰的代码,而我想知道是否有更好的方法。
非常感谢!
答案 0 :(得分:2)
您在<script>
window.connect = function () {
window.alert("Oi");
};
</script>
cmake -G "Visual Studio 14 2015"
处理器中错过了return
,并且可能在then
处理程序中错过methodA
,因为您正在使用< em>详细箭头功能:
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
答案 1 :(得分:1)
你有一个小错误,几乎是一个错字:
promises.push(this.methodA().then(wasOk => {
this.methodB().then(wasOk => {
this.methodC();
});
}));
它是大括号 - 它们将一个承诺的回报改为未定义的回报。你可以这样做:
promises.push(this.methodA().then(wasOk =>
this.methodB().then(wasOk =>
this.methodC();
);
));
或者这个:
promises.push(this.methodA().then(wasOk => {
return this.methodB().then(wasOk => {
return this.methodC();
});
}));
甚至是这样:
promises = [this.methodA(), this.methodB(), this.methodC()];