【问题标题】:FirebaseListObservable + Promise = ? (AngularFire2)FirebaseListObservable + Promise = ? (角火2)
【发布时间】:2017-05-20 12:50:19
【问题描述】:

作为我上一个问题的后续问题(我无法迭代似乎已满的数组),我现在知道问题出在哪里,应该是列表不是刚开始用就满了。

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

问题是,对我来说,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;
  });

(顺便说一句,那个 == 这个)

我得到了“完成”的打印,但我不知道这是否相关

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

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

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

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

catch 也不会将任何内容记录到控制台。

【问题讨论】:

    标签: javascript angularjs firebase promise angularfire2


    【解决方案1】:

    您需要使用解析功能。比如:

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

    【讨论】:

      【解决方案2】:

      您不必创建自己的承诺;您可以使用 RxJS 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();
      

      您还需要使用 first 运算符,因为 observable 需要在 promise 解决之前完成。随着数据库的变化,AngularFire2 列表将继续发出值,但您只需要第一个值。 (如果你想要改变值,promise 是不合适的。)

      【讨论】:

      • 你救了我:)
      猜你喜欢
      • 2016-09-08
      • 2018-03-28
      • 2018-04-18
      • 2021-08-25
      • 1970-01-01
      • 2017-03-04
      • 2017-10-09
      • 2018-04-03
      • 1970-01-01
      相关资源
      最近更新 更多