就像我的问题标题所说,我想将firestore查询结果加载到我全局范围内的变量中,以供以后使用。
我想稍后在动态侦听器中使用该值,而不必一次又一次地重新查询它。
我尝试在Google上寻找简单的解决方案。我已经尝试使用promise,回调和await等待实现自己的解决方案,但无济于事。
这是来自github文档,该文档显示了如何执行我想要的操作,但没有查询。
https://github.com/GoogleCloudPlatform/nodejs-docs-samples/blob/master/functions/tips/index.js
const heavyComputation = () => {
// Multiplication is more computationally expensive than addition
const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9];
return numbers.reduce((t, x) => t * x);
};
const functionSpecificComputation = heavyComputation;
const fileWideComputation = lightComputation;
// [START functions_tips_scopes]
// [START run_tips_global_scope]
// Global (instance-wide) scope
// This computation runs at instance cold-start
const instanceVar = heavyComputation();
这是我自己的尝试
const getNBAScoreKey = () => {
return new Promise(resolve => {
scoresRef.onSnapshot(nbaScoreKeySnapshot => {
console.log("the value inside the score key: " + nbaScoreKeySnapshot.data()["FantScores"]);
resolve(nbaScoreKeySnapshot.data());
});
});
}
我希望变量是带有数据的对象,但是无论我尝试执行哪种实现,我都会得到“未定义”。
答案 0 :(得分:1)
您可以在全局范围内设置变量,然后在scoresRef.onSnapshot
中重新分配它的值,但是如果您尝试立即访问该值而不等待从数据库中获取数据,那么您当然会不确定,因为未获取数据
因此,在您的情况下,您必须使用可观察的设计模式,例如使用rxjs之类的lib或自己实现它,
Observable可让您定义变量并订阅值更改事件。
简单的观察者实现
let observer = {
value: {} ,
subscribers: [] ,
subscribe: function (cb ) { this.subscribers.push(cb)} ,
notify: function (data) { this.value = data ; this.subscribers.forEach( s => s(data);}
}
要订阅值更改,您必须调用observer.subscribe并传递要在数据更改时触发的回调函数
observer.subscribe((data)=> { console.log('first', data ) } ) // first subscriber
observer.subscribe((data)=> { console.log('sec', data ) } ) // sec subscriber
//通知订户值已更改
observer.notify(123)
输出将为
first 123123
sec 123123
您的案子,您必须首先在该观察员的任何地方订阅
observer.subscribe((data)=> {
console.log('I got some data from firestore', data );
// Do some stuff
} );
,然后在获取函数中添加通知
const getNBAScoreKey = () => {
return new Promise(resolve => {
scoresRef.onSnapshot(nbaScoreKeySnapshot => {
console.log("the value inside the score key: " + nbaScoreKeySnapshot.data()["FantScores"]);
let data = nbaScoreKeySnapshot.data();
observer.notify(data);
resolve(data);
});
});
}
您还可以随时通过调用observer.data
来获取数据
确保已在全局范围内或在单独的文件上定义了观察者,并导出了观察者变量,然后将该文件导入到将共享数据的任何地方