Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/469.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从另一个javascript函数中的数组访问数据_Javascript_Arrays_Google Cloud Firestore - Fatal编程技术网

从另一个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,我将阅读此内容,但任何关于我可以使用的代码更改的指导?是的,将日志放在回调内部,而不是外部。