FirebaseListObservable + Promise =? (AngularFire2)

时间:2017-01-05 20:32:08

标签: javascript angularjs firebase promise angularfire2

作为我上一个问题的后续内容(我无法迭代一个似乎已满的数组),我现在知道问题是什么,那应该是列表我开始使用它时并不满。

然后我尝试使用promise来等待异步执行任务,然后继续。

对我而言,承诺语法真的不合适,对于像我这样基本上从未在这个项目之外使用过javascript的人来说似乎太复杂了。

我有这个承诺:

var promise=new Promise(function(resolve,reject){

    that.af.database.list('/users/'+that.authentificationService.getUserId()+'/favs'/*, { preserveSnapshot: true}*/)
      .subscribe(snapshots=>{
          snapshots.forEach(snapshot => {
            //console.log(snapshot.label);
            that.prefList.push(snapshot.label);                
            //this.prefList.push(snapshot.label);
          });
      });

      console.log("promise = done");
      return that.prefList;
  });

(顺便说一句= =这个)

我完成了#34;完成了#34;打印,但我不知道这是否相关

然后我尝试在承诺的函数中做一些事情:

promise.then(function(result){ (...) }

我里面有多个console.logs,但实际上没有执行。我做错了什么?

promise.catch(function(e){
    console.log("catch entered");
    console.log(e);
  });

catch也没有将任何内容记录到控制台。

2 个答案:

答案 0 :(得分:3)

你不必创造自己的诺言;您可以使用RxJS select customerName, occurences, ...运算符(并且可以使用toPromise运算符将收藏夹数组映射到标签数组):

map

您还需要使用import 'rxjs/add/operator/first'; import 'rxjs/add/operator/map'; import 'rxjs/add/operator/toPromise'; ... return that.af.database .list('/users/' + that.authentificationService.getUserId() + '/favs') .map(favs => favs.map(fav => fav.label)) .first() .toPromise(); 运算符,因为observable需要在promise解析之前完成。 AngularFire2列表将在数据库更改时继续发出值,但您只需要第一个值。 (如果您想要更改值,则承诺不合适。)

答案 1 :(得分:2)

您需要使用resolve功能。类似的东西:

new Promise(function (resolve, reject) {
        that.af.database
            .list('/users/' + that.authentificationService.getUserId() + '/favs' /*, { preserveSnapshot: true}*/)
            .subscribe(snapshots => {
                snapshots.forEach(snapshot => {
                    //console.log(snapshot.label);
                    that.prefList.push(snapshot.label);
                    //this.prefList.push(snapshot.label);
                });
                resolve(that.prefList);
            });
    });