[英]Angular 4 wait for promise/observable into a loop
我找不到以下案例的有效解决方案
我想创建以下循环:
在继续循环之前,我需要等待并链接 Firebase 数据的响应,问题是我需要在主循环中与来自 firebase 的数据进行交互(因此我无法在 subscribe 或 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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.