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
的一部分外包给一个函数,该函数完成了工作。