Javascript ForEach比我的可观察返回值快
我有以下代码:Javascript ForEach比我的可观察返回值快,javascript,angular,firebase,rxjs,angularfire2,Javascript,Angular,Firebase,Rxjs,Angularfire2,我有以下代码: evaluateLocations() { const locs = this.currentTour.locIds; let lastLoc = null; locs.forEach(loc => { console.log(lastLoc, loc); if (lastLoc !== null) { console.log('if durch', lastLoc, loc); this.afDb.list('route
evaluateLocations() {
const locs = this.currentTour.locIds;
let lastLoc = null;
locs.forEach(loc => {
console.log(lastLoc, loc);
if (lastLoc !== null) {
console.log('if durch', lastLoc, loc);
this.afDb.list('routes', {
query: {
orderByChild: 'idStart',
equalTo: loc
}
}).switchMap(items => {
console.log('switchMap starts', lastLoc, loc); //here the output is always lastLoc = loc while it shouldn't be that
const filtered = items.filter(item => item.idEnd === lastLoc);
const route = filtered[0];
return Observable.of(route);
}).subscribe();
}
lastLoc = loc;
});
}
现在,在switchMap
发挥作用时,forEach
循环似乎已经完成,因此过滤总是出错
我的逻辑是:我想通过一个ID数组进行循环。然后我调用数据库,该数据库获取所有条目,其起点为
locs[n]
。然后我想过滤locs[n+1]
,它将返回一个结果
理论上,这应该是可行的,但考虑到我从
Firebase
数据库中查询,可观察对象在那里有一个时间延迟,我无法足够快地获得值。我怀疑的另一件事和我读到的是,如果在当前一个完成之前启动另一个,可观察对象
可能会被取消。但是,当我运行代码时,这似乎不是问题。如果要按顺序处理该列表,则需要等待可观察的操作完成。将可观察的
转换为承诺
和等待
的惯用方法:
将其应用于代码:
async evaluateLocations(){//谢谢您的回复,但它不起作用,因为它说我需要一个;
在这行等待这个.afDb.list
。我需要另一个async来调用FirebaseListObservable
?啊,locs.forEach(loc=>{/code>-错过了:)将foreach
重写为常规的for in
循环以避免这种情况。感谢您的帮助。我还需要更改的一件事是将所有loc
替换为loc[loc]
,因为for in
循环使用键而不是值。但是非常感谢您!我的JS确实有点生锈,对不起!:(我将switchMap
的一部分外包给一个函数,该函数完成了工作。