从另一个javascript函数中的数组访问数据
我试图从定义速率变量的函数外部访问它。我已经声明了一个全局速率变量,但在我需要使用它的时候它是“未定义的”。我已经最小化了代码以尽可能保持干净从另一个javascript函数中的数组访问数据,javascript,arrays,google-cloud-firestore,Javascript,Arrays,Google Cloud Firestore,我试图从定义速率变量的函数外部访问它。我已经声明了一个全局速率变量,但在我需要使用它的时候它是“未定义的”。我已经最小化了代码以尽可能保持干净 var db = firebase.firestore(); var docRef = db.collection("pricing").doc("default"); var rate; //Setting up global variable to store value docRef.get().then
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?
docRef.get()
是异步的,在查询完成之前立即返回。您可以使用该承诺,使用附加回调函数,然后使用一段时间后被调用的。同时,您的代码将继续执行。您观察到的是,控制台日志在回调中定义rate
之前运行
您必须进行调整,以便依赖于定义的rate
的代码只能在回调后执行。这通常意味着您在回调中编写代码,或者使用另一个回调
强烈建议了解JavaScript承诺是如何工作的,因为它们对于编写有效的代码至关重要。rate
在块内分配,然后在从docRef.get()返回时执行该块。
将被解析。因此,在调用console.log
时,块异步执行,rate
尚未分配。这是一个竞争条件:rate
在承诺返回时分配——在console.log
之后
您可以将代码设置为同步运行;然后,在返回数据之前,console.log
将不会运行:
请注意,通常不建议这样做,因为这样会对性能和用户体验产生负面影响。请密切注意,您可能会注意到界面的短暂锁定。无论如何,根据您的操作,由于您是一名“新手”,这可能有助于您在此学习和测试。您的控制台。在解决get()
之前执行最后一行的日志。您应该阅读承诺以及JavaScript如何处理异步代码,以了解更多有关此行为的信息。谢谢Wex,我将阅读此内容,但任何关于我可以使用的代码更改的指导?谢谢Doug,我将阅读此内容,但任何关于我可以使用的代码更改的指导?是的,将日志放在回调内部,而不是外部。