作为我上一个问题的后续内容(我无法迭代一个似乎已满的数组),我现在知道问题是什么,那应该是列表我开始使用它时并不满。
然后我尝试使用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也没有将任何内容记录到控制台。
答案 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);
});
});