gpt4 book ai didi

javascript - 使用 firebase 获取给定键数组的多个单独值

转载 作者:行者123 更新时间:2023-11-28 17:56:06 25 4
gpt4 key购买 nike

我正在尝试访问 Firebase 中的多个单独 key 。我使用基于 Promise 的函数和 for 循环来迭代给定的键。

代码如下:

function getFirebaseData(key_arr)
{
var ref_obj,
data_obj = {};
return new Promise(function(resolve)
{
for(var i = 0; i < key_arr.length; i++)
{
key_str = key_arr[i];
ref_obj = firebase.database().ref('path/'+key_str);
ref_obj.on('value', function(snapshot)
{
data_obj[key_str] = snapshot.val();
});
}
resolve(data_obj);
});
}

然后我按如下方式运行:

var key_arr = ['first_key', 'second_key', 'third_key'];
getFirebaseData(key_arr).then(function(result){console.log(result);});

问题是我得到的结果不是全部三个键;我只得到一个。我猜这是因为 for 循环内的代码是异步的,所以 resolve 只给了我第一个 key 。

如何重写它,以便我可以等待 for 循环完成并返回完整结果。

最佳答案

前面的答案是可靠的,除了返回的 promise 解析为 data_obj 数组

因此,您需要做的是将循环的每次迭代更改为 Promise,然后使用 Promise.all 等待所有 Promise 解析

以下是使用 ES2015 的方法 - 当您使用 Promises 时,ES2015 无论如何都不是那么困难

function getFirebaseData(key_arr) {
return Promise.all(key_arr.map(key_str =>
new Promise((resolve, reject) =>
firebase.database().ref('path/'+key_str).once('value', snapshot =>
resolve ([key_str, snapshot.val()])
)
)
)).then(results =>
results.reduce((result, [key, value]) => {
result[key] = value;
return result;
}, {})
);
}

转换为旧式 ES5 为:

function getFirebaseData(key_arr) {
return Promise.all(key_arr.map(function (key_str) {
return new Promise(function (resolve, reject) {
return firebase.database().ref('path/' + key_str).once('value', function (snapshot) {
return resolve([key_str, snapshot.val()]);
});
});
})).then(function (results) {
return results.reduce(function (result, item) {
var key = item[0],
value = item[1];
result[key] = value;
return result;
}, {});
});
}

现在每个单独的 promise 都解析为一个数组,基本上是[key, value]

Promise.all 之后的 .then 将所有这些结果组合到一个对象中,例如:{ key1: value1, key2: value2, ...

The code above uses .once('value' rather than .on('value' - as pointed out in the comments, using .on would leave the listener attached. As Promises can only be resolved ONCE, then it makes sense to use .once

关于javascript - 使用 firebase 获取给定键数组的多个单独值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44402452/

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