0

私は2番目のものを得るために最初のクエリの結果が必要なので、約束を使って2つのFirebaseクエリを連鎖しようとしています。ここでは2つのクエリの構造は次のとおりです。VALUE A FORNativeScript Firebase es6は奇妙な動作を約束します

QUERY:VALUEのB FOR

private getValueA(){ 
    var queryEvent = (result):void =>{ 
     console.dump(result); 
     this._valueA = result.value; 
    } 
    return firebase.query(
     queryEvent, 
     FirebaseValueAPath, 
     { 
      singleEvent : true, 
      orderBy : { 
       type: firebase.QueryOrderByType.CHILD, 
       value: 'since' 
      } 
     }); 
    } 

QUERY:

private getValueB{ 

     let FirebaseValueBPath :string = this._valueA 
     var queryEvent = (result) :void =>{ 
      console.dump(result); 
      if(result.value){ 
       this._valueB = result.value; 
      } 
     } 
     return firebase.query(
      queryEvent, 
      FirebaseValueBPath, 
      { 
       singleEvent : true, 
       orderBy : { 
        type : firebase.QueryOrderByType.CHILD, 
        value : 'since' 
       } 
     }); 
    } 
} 

私は、次の操作を行って、一緒にチェーンにそれらを試してみてください。

結果は次のとおりです。

getValueB 内部関数が(なぜ??)
  • this.valueAは私のクエリは無用作り、getValueBundefinedある getValueA関数内前にconsole.log(結果)を印刷します何らかの理由で210
    1. のAppは

    が間違っウィット何がクラッシュします私のコードですか?私はこの問題のために別のアプローチを使用すべきでしょうか? これを調べていただきありがとうございます。

  • 答えて

    1

    約束を使用する場合は、コールバックの結果を解決する必要があります。 下記のコードを見つけてください:

    class GetData { 
        constructor() { 
         this.getValueA() 
          .then(resultA => this.getValueB(resultA)); 
        } 
    
        getValueA() { 
         return new Promise<string>((resolve, reject) => { 
          firebase.query(
           (result) => { 
            resolve(result.value); // Resolve => returns the result 
           }, 
           FirebaseValueAPath, 
           { 
            singleEvent : true, 
            orderBy : { 
             type: firebase.QueryOrderByType.CHILD, 
             value: 'since' 
            } 
           })); 
         }); 
        } 
    
        getValueB(valueA: string) { 
         return new Promise<string>((resolve, reject) => { 
          firebase.query(
           (result) => { 
            resolve(result.value); // Resolve => returns the result 
           }, 
           valueA, 
           { 
            singleEvent : true, 
            orderBy : { 
             type: firebase.QueryOrderByType.CHILD, 
             value: 'since' 
            } 
           })); 
         }); 
        } 
    } 
    
    +0

    これはそれでした!ありがとう –

    +1

    しかし、1つの質問...これは反パターンとは考えられていませんか? http://stackoverflow.com/questions/23803743/what-is-the-explicit-promise-construction-antipattern-and-how-do-i-avoid-it –

    +0

    私は反パターンを知らなかった。私は何か新しいことを学んだ、ありがとう!あなたのリンクのgithubページを分析した後、私は私の答えがアンチパターンだとは思わない。 'firebase.query'は結果と共に' Promise'を返さないからです。結果コールバックを持つ関数です。ですから、Promiseのような外部ライブラリなしで使用したい場合は、それを 'Promise'コンストラクタでラップする必要があります。それ以外の場合は、githubページのmentionnedのような 'promisify'ライブラリを使うことができます。 – Guillaume