javascript - Angular 4 等待 promise/observable 进入循环

标签 javascript arrays angular observable chain

我找不到以下情况的有效解决方案

我想创建以下循环:

  1. ForEach 数组的元素 (A)
  2. 填充一个新数组 (B)
  3. 如果数组 (B) 中不存在键,则调用 firebase 服务获取数据
  4. 验证数据并更新统计数据
  5. 在所有 (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/

相关文章:

javascript - Angular 点击事件: how to select a checkbox within an a element?

javascript - 将 JS 转换为 Typescript

javascript - 绕过并发 ajax 调用限制的最佳实践

java - selenium 3 AngularJS 单选无法选择在 selenium 2.53 中工作的内容

javascript - Angular2 - 环回 - 安全实现

Javascript 将 SQL 结果绑定(bind)到一个函数

javascript - 图像轮播不会无限反向循环

javascript - 如何将日历作为输入模式嵌入到日期文本框,以便用户选择合适的日期?

javascript - 有人有替代方法吗?

Javascript按值从数组中删除数组元素