从另一个JavaScript函数中的数组访问数据

时间:2020-10-07 19:56:35

标签: javascript arrays google-cloud-firestore

我试图从定义它的函数外部访问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?

3 个答案:

答案 0 :(得分:1)

docRef.get()是异步的,并在查询完成之前立即返回。您可以使用该承诺来附加使用then的回调函数,该回调函数会在一段时间后被调用。同时,您的代码将继续执行。您观察到的是控制台日志在回调中定义rate之前正在运行。

您将不得不进行一些调整,以使依赖于rate的代码必须在回调之后执行。这通常意味着您在回调中内部中编写代码,或使用其他回调。

强烈建议学习JavaScript的承诺如何工作,因为它们对于编写有效的代码至关重要。

答案 1 :(得分:0)

then 块中分配了

rate,该块在从docRef.get()返回的Promise被解析时执行。因此,在调用console.log时,自 then 块开始异步执行以来,尚未分配rate

答案 2 :(得分:0)

这是一个竞争条件:在您的rate之后,诺言返回时会分配console.log

您可以将代码设置为同步运行;然后,console.log直到数据返回后才会运行:

Firebase Firestore retrieve data Synchronously/without callbacks

请注意,通常不建议这样做,因为它会对性能和UX产生负面影响。请密切注意,您可能会注意到界面短暂锁定。无论如何,根据您的操作,由于您是“新手”,因此可以在这里帮助您进行学习和测试。