0

我使用Ionic爲我的應用程序提供與Firebase的連接來提取數據。我在工廠創建了一個承諾,將數據拉下來,並認爲它應該在屏幕上顯示數據,但在我觸摸屏幕之前我什麼也沒有得到。來自ES6承諾的數據在頁面上不顯示,直到我點擊它?

我沒有得到任何錯誤,數據確實來了。

廠:

all: function() { 
      return new Promise ((resolve, reject) => { 
      firebase.database().ref('desks').once('value').then(snapshot => { 
       let desks = [] 
       snapshot.forEach((child) => { 
       desks.push(child.val()); 
       }); 
       resolve(desks) 
      }); 
      }); 

} 

調用工廠:

Office.all().then(function (data) { 
    console.log(data); 
    $scope.officeList = data; 
}); 

我覺得我打電話是錯誤的,否則有一個離子的方法,我似乎無法找到。

一旦完成請求,我將如何能夠呈現數據?

在此先感謝

+0

討論了很多次。 Promise回調是在Angular的範圍之外執行的,所以*髒檢查*不起作用,綁定不會更新。在分配數據後,只需使用'$ scope。$ apply();'$ scope.officeList = data;' –

+0

謝謝。不知道爲什麼我在查找時沒有遇到它:/。希望能夠在一段時間內改變本機的反應,希望它會更乾淨。 – SmiffyKmc

回答

1

ES6承諾不與AngularJS框架集成。使用$q.when將ES6承諾轉換爲AngularJS承諾。只有那些在AngularJS執行上下文應用業務將受益於AngularJS的數據綁定,異常處理,性能看,等

all: function() { 

     ̶r̶e̶t̶u̶r̶n̶ ̶n̶e̶w̶ ̶P̶r̶o̶m̶i̶s̶e̶ ̶(̶(̶r̶e̶s̶o̶l̶v̶e̶,̶ ̶r̶e̶j̶e̶c̶t̶)̶ ̶=̶>̶ ̶{̶   
    var es6promise = firebase.database() 
     .ref('desks').once('value') 
     .then(snapshot => { 
      let desks = [] 
      snapshot.forEach((child) => { 
      desks.push(child.val()); 
      }); 
      ̶r̶e̶s̶o̶l̶v̶e̶(̶d̶e̶s̶k̶s̶)̶ 
      return desks; 
    }); 

    return $q.when(es6promise); 
} 

此外,還要避免使用Promise(resolve,reject創造新的承諾。請使用.then method返回的承諾。它返回一個新承諾這是通過successCallback的返回值解決或拒絕,errorCallback(除非該值是一個承諾,在這種情況下它與在使用promise chaining這一承諾解決價值解決)。

欲瞭解更多信息,請參閱You're Missing the Point of Promises