0

我試圖鏈接2使用承諾的Firebase查詢,因​​爲我需要第一個查詢的結果來獲得第二個。這裏是2所查詢的結構:NativeScript Firebase ES6承諾奇怪的行爲

查詢值:

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' 
      } 
     }); 
    } 

查詢值b:

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' 
       } 
     }); 
    } 
} 

我然後通過執行以下操作儘量鏈在一起:

constructor(){ 
    this.getValueA().then(
    (success) :void => { 
    this.getValueB(); 
    }); 
} 

其結果如下:

  1. 對於內部getValueB 功能因故console.log(result)被內部 以前的console.log(結果)打印getValueA功能(爲什麼?)
  2. this.valueAgetValueBundefined,使我的查詢沒用
  3. 應用程序崩潰

什麼是錯的機智我的代碼?我應該使用另一種方法來解決這個問題嗎? 預先感謝您對此進行調查:)

回答

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

雖然......有一個問題不是被認爲是反模式嗎? http://stackoverflow.com/questions/23803743/what-is-the-explicit-promise-construction-antipattern-and-how-do-i-avoid-it –

+0

我不知道反模式。我學到了一些新東西,謝謝!在分析鏈接中的github頁面之後,我不認爲我的答案是反模式。因爲'firebase.query'不會返回帶有結果的'Promise'。這是一個帶結果回調的函數。所以,如果你想以Promise的方式使用它,而沒有任何EXTERNAL LIBRARY,你必須將它包裝在'Promise'構造函數中。否則,你可以像github頁面中提到的那樣使用'promisify'庫。 – Guillaume