0

2つのfirebaseオブジェクトcountregsとmaxregsを比較しようとしています。私はこのようなブール値を返したいと思いますが、値に関係なくいつも真実になります。 値を表示すると、countregs = 3およびmaxregs = 5と表示されますので、falseを返す必要があります。firebaseオブジェクトを呼び出す関数は常にtrueを返します

ありがとうございます!

getMaxRegs(company: string) { 
    var snapshotMaxRegs = this.db.object(`companies/${company}/maxregs`,{ preserveSnapshot: true}) 

    snapshotMaxRegs.subscribe(snapshot => { 
     console.log('maxRegs = '+ snapshot.val()) 
     return snapshot.val(); 
    }); 
} 

getCountRegs(company: string){ 
    var snapshotCountRegs = this.db.object(`companies/${company}/countregs`,{ preserveSnapshot: true}) 

    snapshotCountRegs.subscribe(snapshot => { 
     console.log('currRegs = '+ snapshot.val()) 
     return snapshot.val(); 
    }); 
} 

maxRegsReached(company: string){ 
    if (this.getCountRegs(company) >= this.getMaxRegs(company) 
     || this.getCountRegs(company) == this.getMaxRegs(company)) 
    { 
     return true; 
    } else { 
     return false; 
    } 
} 

答えて

0

あなたの機能getCountRegsgetMaxRegs両方リターンundefined、それらに含まれる唯一のreturn文は、コールバック関数と、彼らは非同期で呼び出す関数内にネストされています。

async getMaxRegs(company: string): Promise<number> { 
    const snapshotMaxRegs = this.db.object(`companies/${company}/maxregs`,{ 
    preserveSnapshot: true}); 

    return snapshotMaxRegs.map(snapshot => snapshot.val()).toPromise(); 
} 

getCountRegs(company: string): Promise<number> { 
    const snapshotCountRegs = this.db.object(`companies/${company}/countregs`,{ 
    preserveSnapshot: true}); 

    return snapshotCountRegs.map(snapshot => snapshot.val()).toPromise(); 
} 

async maxRegsReached(company: string) : Promise<boolean>{ 
    const count = await this.getCountRegs(company); 
    const max = await this.getMaxRegs(company); 
    return count >= max; 
} 

をして、呼び出し元の関数もasync宣言されなければならないし、その結果をawaitしなければならないthis.maxRegsReached()を呼び出すために:あなたは、非同期的に考え始める必要があります。

いつも、awaitは結果を待っている間にあなたの他のコードをすべて実行できることを覚えておいてください。

0

getMaxRegsgetCountRegsは技術的に何も返さないため、意味のある比較はできません。

getMaxRegsgetCountRegsの方法でObservableを返すのは、サブスクリプションではなく.map()です。次に、maxRegsReached()の2つの観測値(.forkJoinを使用)を結合し、2つの値を比較することができます。

getMaxRegs(company: string) { 
    var snapshotMaxRegs = this.db.object(`companies/${company}/maxregs`,{ preserveSnapshot: true}) 

    return snapshotMaxRegs.map(snapshot => { 
     console.log('maxRegs = '+ snapshot.val()) 
     return snapshot.val(); 
    }); 
} 

getCountRegs(company: string){ 
    var snapshotCountRegs = this.db.object(`companies/${company}/countregs`,{ preserveSnapshot: true}) 

    return snapshotCountRegs.map(snapshot => { 
     console.log('currRegs = '+ snapshot.val()) 
     return snapshot.val(); 
    }); 
} 

maxRegsReached(company: string){ 

    return Observable.forkJoin([ 
     this.getCountRegs(company), 
     this.getMaxRegs(company) 
    ]).map((joined)=>{ 
     let countRegs = joined[0]; 
     let maxRegs = joined[1]; 

     return countRegs >= maxRegs; 
    }) 
} 

今、あなたは結果を得るためにmaxRegsReachedに加入する必要があります:あなたはまだ何もしていない

this.maxRegsReached('company name').subscribe(result => { 
     console.log(result) //true or false 
}) 
+0

注意がmaxRegsReached' 'から返されます。 – Duncan

+0

@ダンカンあなたは正しいです。私は彼がボタン呼び出しなどで 'maxRegsReached'を使用していると自動的に判断します。私の悪い。 – CozyAzure

+0

'.map([countRegs、maxRegs] => countRegs> = maxRegs)'を実行して、 'joined'のスペルミスを保存することもできます。 – Duncan

関連する問題