這里有很多關于這個主題的類似問題,但似乎所有問題都有非常具體的答案,似乎不適用于我的案例。
我將 Google Firebase RTB 資料快照傳遞給此函式。我想將該快照轉換為一組自定義物件。每個物件代表一個子節點和所有子節點。我還想在回傳陣列之前對子資料進行一些處理。后處理是問題所在,因為您不能在 foreach 中的函式上呼叫 await。
挖掘之后,我在StackOverflow上找到了這種方法,它創建了一個子函式來決議資料并將所有承諾存盤在它們自己的陣列中,并從頂層呼叫(等待)getData() 函式:
export async function unpack_snap(snap: any): Promise<(CustomObject[] | null)>{
const toWait: any[] = [];
console.log(JSON.stringify(snap));
await snap.forEach(async obj => {
toWait.push(obj_from_snap((obj))); // add this promise to the array
console.log(obj.key); // I added this to see if it was looping
});
await Promise.all(toWait);
return toWait;
}
export async function obj_from_snap(co: DataSnapshot) : Promise<(CustomObject | null)>{
var newCO: CustomObject = {
val1 : co.val().val1,
val2 : co.val().val2,
Data : await GetData(co.key)
};
console.log(`Data: ${newCO.Data}`)
return newCO;
}
export async function getData(key: String) Promise<(String | null)>{
...
}
不幸的是,這會回傳一個包含空物件的陣列(日志顯示:[{}])。forEach 中的日志記錄輸出只會觸發一次,即使快照的字串化 JSON 顯示多個有效子項也是如此。與在輔助函式中記錄 newCO.Data 相同。
為什么這個程序不回圈?
另外,如果我回傳 toWait[] 陣列,它是否會包含作為輔助函式輸出的所有 CustomObject 物件?如果沒有,是否有更好的方法讓我得到一個 CustomObject 陣列,每個都來自不同的函式呼叫?修改后的 JSON 作為輸出也可以。
有什么建議么?感謝您的時間。
更新
我試圖回圈遍歷 ForEach 并列印密鑰。
await snap.forEach(async obj => {
console.log(obj.key); // I added this to see if it was looping
});
return null;
和以前一樣,第一個子鍵被列印出來,函式退出,回傳 null,不管有多少個子節點。我不明白為什么代碼沒有遍歷回圈,這讓我相信這不是 Promise.all() 的問題。想法?
uj5u.com熱心網友回復:
我能夠回答我的兩個問題!在這里發帖以防有一天有人發現這個......
export async function unpack_snap(snap: any): Promise<(any[] | null)>{
var array: any[] = []; // Array of objects
const toWait: any[] = []; // Array of promises
console.log(JSON.stringify(snap)); // Log the input for debugging
await snap.forEach(function(obj) { // CHANGED FROM async (obj) to function (obj)
toWait.push(obj_from_snap((obj)).then((result) => array.push(result))); // Added a chained promise to the first, which adds the result to my output array
});
await Promise.all(toWait); // wait until all promises are complete
return array; // return the array
}
這按預期作業。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/533681.html
標籤:Google Cloud Collective 打字稿异步firebase-实时数据库谷歌云功能
