2016-12-26 16 views
0

私は、チェーンの約束を平凡な約束事に変える方法があるかどうかを知りたいと思います。私はこのコードを持っている: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。

ありがとうございます!

答えて

2

あなただけ欠けているreturnmethodA上ごthenハンドラでは、おそらく内そのthenハンドラ、あなたが冗長を使用しているため arrow functions:

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() 
) 
)); 

注:

  • 01を呼び出すそれが解決するのを待ち、その後、その後、
  • コールmethodB、それが解決するのを待ち、
  • コールmethodC

だから全体的に、あなたの配列の最初の約束はmethodBmethodCまで解決されません解決する; methodDがすぐに呼び出されるため、早く解決できる可能性があります。

配列構造は、同様に簡単かもしれない:

promises = [ 
    this.methodA().then(wasOk => 
    this.methodB().then(wasOk => 
     this.methodC() 
    ) 
), 
    this.methodD() 
]; 
+0

あなたが正しいです。私の元のコードでは、メソッドBとCは呼び出されませんでした。私の問題は、このチェーンでは、メソッドBとCは、親の約束の結果に応じて呼び出す必要があるだけなので、中にいくつかの "if"を入れるには中括弧が必要です。実際のコードで質問を更新します。ありがとう! –

+0

@VladimirVenegas:上記のように、 'methodB'は' methodA'の結果を使用でき、 'methodC'は' methodA'と 'methodB'の両方の結果を使用できます。チェーン内にないのは(並行して) 'methodD'だけです。 –

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()];