reactjs - 在使用 onSnapshot 回调时,如何获得一个调用 firebase.firestore.set 的异步 React 函数来等待?
问题描述
这是我当前代码的[简化版本]:
export const setTimestamp = async () => {
console.log("START")
let result = null;
const dbRef = await firestore.collection("collectionName").doc("docName");
const unsub = await dbRef.onSnapshot(snap => {
result = snap.data();
console.log("ACTUAL END", result);
});
await dbRef.set({ serverTime: firebase.firestore.FieldValue.serverTimestamp() });
unsub();
console.log("FUNCTION END", result);
return result;
};
FUNCTION END
当前已记录在我之前ACTUAL END
,而我反过来需要它。有任何想法吗?是否有替代使用onSnapshot
?
感谢您的阅读。
解决方案
嗯,onSnapshot
是event
返回Promise
订阅的 a 。但该事件将在订阅后触发。如果要确保触发事件,则需要另一个Promise
处理该场景的事件:
const res = await new Promise( async resolve=> {
const unsub = await dbRef.onSnapshot(snap => {
result = snap.data();
console.log("ACTUAL END", result);
resolve({result,unsub});
});
});
await dbRef.set({ serverTime: firebase.firestore.FieldValue.serverTimestamp() });
res.unsub();
console.log("FUNCTION END", res.result);
return res.result;
推荐阅读
- javascript - 如何将消息从 background.js 传递到内容脚本并操作 DOM?
- junit - 模拟 Spring 数据存储库
- javascript - 使用不同的值多次打印当前页面
- matlab - 仍然不明白如何在最优问题中添加松弛变量
- dialogflow-es - 如何使用 DialogFlow 获取字母数字类型的实体
- edges - OSMnx 教程 8(波音)- 中心性
- visual-studio-code - 有没有办法将后退和前进菜单项添加为工具栏 Visual Studio Code 上的按钮?
- vue.js - 如何使用 vue-router 自动更改页面?
- javascript - 使用循环返回子集
- python-3.x - 如何在熊猫数据框中删除多个(〜5000)列?