Javascript 角度4等待承诺/观察到循环
我找不到以下情况的有效解决方案 我想创建以下循环:Javascript 角度4等待承诺/观察到循环,javascript,arrays,angular,observable,chain,Javascript,Arrays,Angular,Observable,Chain,我找不到以下情况的有效解决方案 我想创建以下循环: 数组的每个元素(A) 填充新数组(B) 如果数组(B)中不存在密钥,请调用firebase服务获取数据 核实数据并更新统计数据 在所有(A)键的末尾,生成执行的统计信息并公开 在继续循环之前,我需要等待并链接Firebase数据的响应,问题是我需要在主循环中与来自Firebase的数据交互(因此我无法在subscribe或then中实现它) 这是我要创建的代码部分: // Here i check if user exist i
// 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(); }
getUser(idutene):承诺{
返回此.db.object('user/'+idutene).map(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
“主循环”是一个
for
循环吗?即使循环是同步的,它也不能阻止异步调用。因此,在调用异步调用后,循环将继续。您需要使用回调函数来控制最终结果。(可能所有回调都已完成,然后返回最终结果)好的,关键是异步调用时循环尚未完成。。。我需要异步调用的数据以继续循环。。。有没有办法让函数等待?(比如如果我在本地数组中有所有的数据?)问题是我需要用异步调用的数据继续“Main”循环。。。所以在回拨时,我需要设置其他“计数器”,并决定继续主循环。。。因此,我不需要一直调用“异步”函数。。。如果我让用户在主循环中,我将详细说明数据…我认为您需要重新思考,您不能为异步阻塞主循环,因此您不能让主循环异步等待您。因此,您需要认为它基于异步编程,而不是传统编程。好的,那么没有办法让主循环等待(链)答案吗?是的,您可以检查这一点来解释javascript的循环