gpt4 book ai didi

javascript - 如何循环遍历 Firebase 文档以查找匹配文档,然后提取名称?

转载 作者:行者123 更新时间:2023-12-02 22:14:40 25 4
gpt4 key购买 nike

我有一个 Firebase 设备集合,其中有一个名为“状态”的字段。

我希望我的代码循环遍历每个文档,找到任何一个状态为 0 的文档,并将该状态更新为 2。最后,我想获取状态发生更改的设备的名称。

运行我的代码后,它确实正确找到并更新了集合中的文档,但是我无法返回 Promise.resolve(..)存储文档名称。

它似乎只输出“事务失败:没有找到状态为0的设备”,意思是return Promise.reject('No devices with state 0 found');在不应该达到的时候却达到了。

这是我的代码:

  let deviceRef = db.collection("devices");

let transaction = db.runTransaction(t => {
return t.get(deviceRef)
.then(snapshot => {
snapshot.forEach(doc => {
console.log(doc.id, '=> state:', doc.data().state);
if (doc.data().state == 0) {
doc.ref.update({ state: 2 });
return Promise.resolve(doc.id + ' has been changed to state 2');
}
});
return Promise.reject('No devices with state 0 found');
});
}).then(result => {
console.log('Transaction success', result);
}).catch(err => {
console.log('Transaction failure:', err);
});

代码确实达到doc.ref.update({state: 2});因为我可以看到 Firebase 集合已被正确修改,但是 return Promise.resolve(doc.id + ' has been changed to state 2');似乎没有被“捕获”。

我做错了什么?

我怀疑我错误地使用了 promise 。一些研究使我相信我需要使用 Promise.all或某种形式的 map 来处理 forEach .

最佳答案

您的问题在于您返回的 Promise.resolve。它只会返回到 forEach 中,并且 return.reject 始终会执行。我强烈建议添加一些控制台日志,以便您可以看到这种情况的发生。另外,您有多个可能会更新的文档,所以我不确定您是如何看到单个 Promise.resolve 工作的,也许您打算做如下的事情,它保留了一系列 promise ?

.then(snapshot => {
var promises = [];
snapshot.forEach(doc => {
console.log(doc.id, '=> state:', doc.data().state);
if (doc.data().state == 0) {
doc.ref.update({
state: 2
});
//this is only returning into the forEach
//return Promise.resolve(doc.id + ' has been changed to state 2');
promises.push(Promise.resolve(doc.id + ' has been changed to state 2'));
}
});
if(promises.length){
return Promise.all(promises);
}
return Promise.reject('No devices with state 0 found');
});

关于javascript - 如何循环遍历 Firebase 文档以查找匹配文档,然后提取名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59429364/

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