0

我正在編寫Firebase雲端函數,並試圖找出Promise.all的工作原理。在我的代碼,我傳遞一個array of database queries和我想的read the resulting array,但我只獲得了垃圾:爲什麼在使用Promise.all時無法在Promise中返回snapshot.val()?

T { 
    A: 
    P { 
    k: Sb { Ka: [Function: vb], ba: [Object] }, 
    aa: P { k: [Object], aa: null, wb: [Object], Bb: '' }, 
    wb: Zc { ld: [Object], ac: [Object] }, 
    Bb: null }, 
    V: 
    R { 
    u: 
     Gd { 
     app: [Object], 
     L: [Object], 
     Ua: [Object], 
     Sc: null, 
     ca: [Object], 
     td: 1, 
     Qa: [Object], 
     va: [Object], 
     qg: [Object], 
     jc: [Object], 
     ee: [Object], 
     md: [Object], 
     ia: [Object], 
     Xa: [Object], 
     cd: 2, 
     fe: null, 
     K: [Object] }, 
    path: J { o: [Object], Y: 0 }, 
    m: 
     Df { 
     xa: false, 
     ka: false, 
     Ib: false, 
     na: false, 
     Pb: false, 
     oa: 0, 
     kb: '', 
     bc: null, 
     xb: '', 
     Zb: null, 
     vb: '', 
     g: Tc {} }, 
    Kc: false, 
    then: undefined, 
    catch: undefined }, 
    g: Tc {} } 

我期待一個簡單的JSON:

{ 
    "name": "Foo", 
    "number": 2521 
    // And a few other fields 
} 

BTW,我看着Jen's video,所以我知道我在做什麼是錯的;我只想知道爲什麼我現有的代碼不起作用。 (我沒有測試過,但我相信,解決辦法是在我的數據庫查詢返回的原始快照,然後做.val()調用)

相關的代碼,如果該鏈接消失:

function mergeTeams(duplicates) { 
    return Promise.all([ 
     admin.database().ref(someRef).once('value', (snap) => { 
      return snap.val(); 
     }), 
     admin.database().ref(someRef2).once('value', (snap) => { 
      return snap.val(); 
     }) 
    ]).then(values => { 
     console.log(values); 

     const team1 = values[0]; 
     const team2 = values[1]; 
     console.log(team1); 
     console.log(team2); 
} 
+0

你沒有展示你如何使用'Promise.all' - 可能是不正確的(把相關的代碼問題) –

+0

是的,我點擊了名爲「數據庫查詢數組」的鏈接。或點擊這裏:https://github.com/SUPERCILEX/Robot-Scouter/blob/717c90264e077011ce35044b3955140e1741066c/firebase/functions/index.js#L50-L55 – SUPERCILEX

+0

不,相關的代碼應該在這個問題 –

回答

0

所以,下面是工作的代碼(下面的說明):

return Promise.all([ 
    admin.database().ref(teamRef + duplicates.teamKey1).once('value'), 
    admin.database().ref(teamRef + duplicates.teamKey2).once('value') 
]).then(values => { 
    const team1 = values[0].val(); 
    const team2 = values[1].val(); 

    console.log(team1); 
    console.log(team2); 
}); 

它的工作原理的原因是因爲我一直得到values陣列中的承諾,即使我不知道它。以下是Promise.all返回的結果:一個包含承諾的原始結果的數組。當我返回success callback內的東西時,實際上並沒有做任何事情,因爲它不是承諾的一部分;我只是隨機的東西回到一個空虛的空白處。當我印刷團隊時,實際上我正在記錄Firebase Snapshot對象而不是.val()

+1

「我想這是一個JS的東西」可能是不正確的。你有一個文檔參考文件來描述'once'使用兩個參數嗎? – traktor53

+0

@ Traktor53哦,真的。這樣會更有意義,讓我看看它。 – SUPERCILEX

+0

@ Traktor53謝謝,我想我現在真的明白了!是的,當我回饋的時候,Firebase的成功回調與JS'Promise'沒有任何關係。 – SUPERCILEX

相關問題