2017-06-22 105 views
-1

在這段代碼我想要得到的posSnapshot.val().case並將其存儲在tatarget VAR,爲了這個,我需要執行dbCall()功能之前console.log('TARGETOUT', tatarget)火力地堡異步數據庫

function dbCall() { 

    var toReturn; 

    return admin.database().ref().child('games/' + event.params.gameId + '/player1/boats').once('value').then(function(snapshot) { 

     snapshot.forEach(function(typeSnapshot) { 

      typeSnapshot.forEach(function(posSnapshot) { 

       console.log('POSKEY', posSnapshot.key); 

       if(posSnapshot.key != 'status') { 

        console.log(rngPos, incr, posSnapshot.val().state); 

        if(rngPos == incr && posSnapshot.val().state == 0) { 

         console.log('==='); 

         return(posSnapshot.val().case); 
        } 
        else if(rngPos == incr && posSnapshot.val().state == 1) { 

         return('1'); 
        } 

        incr ++; 
       } 
      }); 
     }); 
    }); 
} 

var loopPromise = new Promise(function(resolve, reject) { 

    DD = dbCall(); 

    tatarget = DD.then(function(dbResult) { 

     console.log(dbResult); 

     return dbResult; 
    }); 

    console.log('TARGETOUT', tatarget); 

    console.log('TARGETRESOLVE', tatarget); 

    resolve(tatarget); 
}); 

loopPromise.then(function(loopResult) { 

    console.log(loopResult); 
}); 

我的問題是,dbCall()功能結束後, console.log

我試過每個承諾,每個回調函數,我也試過asyncawait,但Firebase不處理它。

我工作了超過15小時的這部分代碼。

有人能幫助我嗎?

謝謝!

回答

0

這總是可以被組織更好,但基本上你:

  1. 返回從dbCall()
  2. 等待的Firebase ref承諾對承諾與then()
  3. 執行您想要的功能
  4. resolve你的諾言,因爲loopPromise是承諾

function dbCall() { 

    var toReturn; 

    return admin.database().ref().child('games/' + event.params.gameId + '/player1/boats').once('value'); 
} 

var loopPromise = new Promise(function(resolve, reject) { 

    dbCall().then(function(snapshot) { 

     snapshot.forEach(function(typeSnapshot) { 

      typeSnapshot.forEach(function(posSnapshot) { 

       console.log('POSKEY', posSnapshot.key); 

       if(posSnapshot.key != 'status') { 

        console.log(rngPos, incr, posSnapshot.val().state); 

        if(rngPos == incr && posSnapshot.val().state == 0) { 

         console.log('==='); 

         resolve(posSnapshot.val().case); 
        } 
        else if(rngPos == incr && posSnapshot.val().state == 1) { 

         resolve('1'); 
        } 

        incr ++; 
       } 
      }); 
     }); 

     print(dbResult); 
    }); 
}); 

loopPromise.then(function(loopResult) { 
    console.log(loopResult); 
}); 

function print(tatarget) { 
    console.log('TARGETOUT', tatarget); 
    console.log('TARGETRESOLVE', tatarget); 
}