我找不到以下情况的有效解决方案
我想创建以下循环:
- ForEach 数组的元素 (A)
- 填充一个新数组 (B)
- 如果数组 (B) 中不存在键,则调用 firebase 服务获取数据
- 验证数据并更新统计数据
- 在所有 (A) key 的末尾,生成执行统计信息并公开...
在继续循环之前,我需要等待并链接 Firebase 数据的响应,问题是我需要在主循环中与来自 firebase 的数据进行交互(所以我无法在订阅或 then 中实现它)
这是我要创建的代码部分:
// Here i check if user exist in array (B)
let IDUtente = RifEvento.esisteUtente(Ordini.IDUtente) ;
// If not exists i'll get data from FIREBASE
if (IDUtente == -1) {
let NewUser = new TipoStatUtente() ;
NewUser.Chiave = Ordini.IDUtente ;
IDUtente = RifEvento.Utenti.push(NewUser) ;
IDUtente = IDUtente - 1 ;
// I NEED to wait the end of this function before continue with loop
this.statoUtente.getUser(IDUtente).then(dati => {
console.log('Sottoscritto dati utente') ;
let user : TipoSingoloUtente = dati ;
NewUser.sonoscuola = user.sonoscuola ;
if (!NewUser.sonoscuola) NewUser.Intestazione = user.Cognome + ' ' + user.Nome ; else NewUser.Intestazione = user.Scuola.Nome ;
if (NewUser.sonoscuola) RifEvento.NumScuole += 1 ; else RifEvento.NumUtenti += 1 ;
})
}
console.log(IDUtente) ;
// Utente Esiste aggiorno le sue statistiche
RifEvento.Utenti[IDUtente].Commissioni += Ordini.costoCommissione ;
RifEvento.Utenti[IDUtente].Incasso += Ordini.parziale ;
if (Ordini.Tipo == 'T') {
RifEvento.Utenti[IDUtente].NumTicket += Ordini.numbiglietti ;
} else {
RifEvento.Utenti[IDUtente].NumIscritti += 1 ;
RifEvento.Utenti[IDUtente].NumBallerini += Ordini.IDBallerini.length ;
}
}
这是函数:
getUser(IDUtente) : Promise<TipoSingoloUtente> {
return this.db.object('user/' + IDUtente).map(users => {
return users ;})
.first()
.toPromise(); }
最佳答案
也许这个伪代码可以显示将异步调用放入循环并确保所有调用都完成然后做某事的实现。
global count = 0
loop A[i] i:0->A.size
var B
if(A[i] NOT IN B)
async_function(A[i], callback(result))
else
//do something
count++
end if
end loop A
callback(result)
//do something
count++
if count == A.size
//all data has been processed
//you also can only count the asyn calls
//final report
else
//do nothing
end callback
关于javascript - Angular 4 等待 promise/observable 进入循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46743256/