gpt4 book ai didi

javascript - 递归 Promise.all 与 firebase 中的快照

转载 作者:行者123 更新时间:2023-12-01 01:46:44 24 4
gpt4 key购买 nike

我的 firebase 数据库具有以下结构:

enter image description here

我需要获取pin键的值。为此,我正在使用这样的递归函数:

let pins = [];

const normalize = (snapchot) => {
snapchot.forEach(function(child) {
if(child.val().pin) {
pins.push(Promise.resolve(child.val().pin));
}
else normalize(child);
});
return Promise.all(pins);
}

现在,调用 normalize 函数:

normalize(snapshot) // snapshot represents the data from the firebase db
.then(p => {
console.log(p); // [ 'mi-pin-agosto', 'mi-pin-julio' ]
})
.catch(err => {
// handle error
})

它确实有效,但是当我调试该代码时,我发现 return Promise.all(pins); 被多次调用。在 foreach 完全完成之后,我只需要被调用一次;这是针对性能情况的想法,因为快照数据比我在图像中看到的要大。

有什么想法吗???

最佳答案

只有当您可以将递归函数作为“内部”`normalize

函数时才使用 Promise.all
const normalize = (snapshot) => {
const process = x => {
let ret = [];
x.forEach(function(child) {
if(child.val().pin) {
ret.push(Promise.resolve(child.val().pin));
} else {
ret = ret.concat(process(child));
}
});
return ret;
});
return Promise.all(process(snapshot));
}

此代码也不需要全局数组来存储结果

但是,由于您正在调用的任何代码都没有任何异步 - 无需使用normalize内的Promises

const normalize = (snapshot) => {
let ret = [];
snapshot.forEach(function(child) {
if(child.val().pin) {
ret.push(child.val().pin);
} else {
ret = ret.concat(normalize(child));
}
});
return ret;
};

如果您确实必须在这段代码中使用 Promise,您可以简单地

Promise.all(normalize(snapshot))
.then(p => {
console.log(p); // [ 'mi-pin-agosto', 'mi-pin-julio' ]
})
.catch(err => {
// handle error
})

关于javascript - 递归 Promise.all 与 firebase 中的快照,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51887235/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com