【发布时间】:2020-05-26 02:57:20
【问题描述】:
我今天一直在用 JS 编写代码。我基本上有一个服务器,它返回一个输出作为一个承诺。
基本上考虑以下代码:
let reviewData = [];
db.get()
.then(function (snap) {
snap.forEach(function (doc) {
reviewData.push(doc.data());
console.log(reviewData[0]); //this works
});
});
console.log(reviewData[0]); //this does not work here
当我尝试在此代码之外访问 reviewData 时,它显示为空。但是,当我访问评论数据时,在 then 函数中,它就在那里。
这是有道理的,因为 db.get() 返回一个已解决的承诺。
另外,我的网页上有一个按钮,点击后执行功能。
<button onclick="doThis()">Click</button> //this code is in the html document
function doThis() {
console.log(reviewData[0]); //this works? Why?
}
我唯一的问题是,当一个 onclick 函数被触发时,来自 promise 的数据怎么是可见的? onclick函数是否等待reviewData被推送?
所有脚本代码都在一个外部文档中。
【问题讨论】:
-
db.get()是异步的,不会在第一个日志之前完成......但肯定会在您触发事件之前完成。不,onclick不等待承诺……只是在您单击按钮之前很久就自行解决了 -
@charlietfl 所以基本上,只是碰巧在我的代码中,db.get() 完成了。它与等待 db.get() 的 onclick 函数没有任何关系,对吧?例如,如果我删除了 onclick 函数并只调用了 doThis(),它可能不会给我任何东西吗?
-
没错..
-
@charlietfl 好的,很高兴知道。那么我需要进行一些重构,这是一个危险的情况哈哈。
-
我的 cmets 也是基于无连接或其他请求错误。在理想情况下,该请求将在一秒钟内完全完成,并且您可能需要更长的时间才能看到并单击按钮
标签: javascript asynchronous onclick synchronization