来自ES6承诺的数据在我点击之前不会在页面上呈现?

时间:2017-10-13 17:05:57

标签: angularjs ionic-framework firebase-realtime-database angular-promise es6-promise

我使用Ionic为我的应用程序连接到Firebase来提取数据。我在工厂中创建了一个承诺来提取数据,并认为它应该在屏幕上完成后呈现数据,但是在触摸屏幕之前我什么都没得到?

我没有收到任何错误,数据确实来了。

厂:

free

致电工厂:

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

}

我觉得我说错了,否则就有一种我似乎无法找到的离子方法。

一旦完成请求,我将如何呈现数据?

提前致谢

1 个答案:

答案 0 :(得分: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返回的承诺。它返回一个新的承诺,它通过successCallbackerrorCallback的返回值被解析或拒绝(除非该值是一个承诺,在这种情况下它是通过使用promise chaining)在该承诺中解决的值。

有关详细信息,请参阅You're Missing the Point of Promises