我试图从定义它的函数外部访问rate变量。我已经声明了一个全局速率变量,但是在需要使用它的时候它是“未定义的”。我已将代码最小化,以使其尽可能保持干净。
var db = firebase.firestore();
var docRef = db.collection("pricing").doc("default");
var rate; //Setting up global variable to store value
docRef.get().then(function(doc) {
console.log("Document data:", doc.data().base); //This works
rate = doc.data().base;
console.log("Rate:", rate); //This works
});
console.log("Rate:", rate); //rate is "undefined" but rate variable value
//is accessible if typed via the console?
答案 0 :(得分:1)
docRef.get()
是异步的,并在查询完成之前立即返回。您可以使用该承诺来附加使用then
的回调函数,该回调函数会在一段时间后被调用。同时,您的代码将继续执行。您观察到的是控制台日志在回调中定义rate
之前正在运行。
您将不得不进行一些调整,以使依赖于rate
的代码必须在回调之后执行。这通常意味着您在回调中内部中编写代码,或使用其他回调。
强烈建议学习JavaScript的承诺如何工作,因为它们对于编写有效的代码至关重要。
答案 1 :(得分:0)
rate
,该块在从docRef.get()
返回的Promise被解析时执行。因此,在调用console.log
时,自 then 块开始异步执行以来,尚未分配rate
。
答案 2 :(得分:0)
这是一个竞争条件:在您的rate
之后,诺言返回时会分配console.log
。
您可以将代码设置为同步运行;然后,console.log
直到数据返回后才会运行:
Firebase Firestore retrieve data Synchronously/without callbacks
请注意,通常不建议这样做,因为它会对性能和UX产生负面影响。请密切注意,您可能会注意到界面短暂锁定。无论如何,根据您的操作,由于您是“新手”,因此可以在这里帮助您进行学习和测试。