Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 角度4等待承诺/观察到循环_Javascript_Arrays_Angular_Observable_Chain - Fatal编程技术网

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

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

我想创建以下循环:

  • 数组的每个元素(A)
  • 填充新数组(B)
  • 如果数组(B)中不存在密钥,请调用firebase服务获取数据
  • 核实数据并更新统计数据
  • 在所有(A)键的末尾,生成执行的统计信息并公开
  • 在继续循环之前,我需要等待并链接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(); }
    
    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的循环