私は、チェーンの約束を平凡な約束事に変える方法があるかどうかを知りたいと思います。私はこのコードを持っている: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;
}
}
このコードは、1つの問題があります:Q.allのみmethodAとmethodDに待っているの。メソッドBとメソッドCを待つことはありません。
私は、メソッドBとCを約束のベクトルに入れたり、別のベクトルを作成して最初のQ.all ...の内部で待つ必要があると思いますが、それは明確なコードではありません。より良いaproach。
ありがとうございます!
あなたが正しいです。私の元のコードでは、メソッドBとCは呼び出されませんでした。私の問題は、このチェーンでは、メソッドBとCは、親の約束の結果に応じて呼び出す必要があるだけなので、中にいくつかの "if"を入れるには中括弧が必要です。実際のコードで質問を更新します。ありがとう! –
@VladimirVenegas:上記のように、 'methodB'は' methodA'の結果を使用でき、 'methodC'は' methodA'と 'methodB'の両方の結果を使用できます。チェーン内にないのは(並行して) 'methodD'だけです。 –