【问题标题】:Do onlick functions wait for promises?onclick 函数是否等待承诺?
【发布时间】: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


【解决方案1】:

Javascript 是异步的。动作顺序如下: 1.let reviewData = []; 2.db.get() 3.console.log(reviewData[0])(现在什么都没有) 4.function (snap) { snap.forEach(function (doc) { reviewData.push(doc.data()); console.log(reviewData[0]); })}} 5.function doThis() { console.log(reviewData[0]);}

【讨论】:

    猜你喜欢
    • 2018-02-03
    • 2020-11-19
    • 1970-01-01
    • 2021-10-10
    • 1970-01-01
    • 2013-09-16
    • 2020-05-15
    • 2021-08-17
    • 1970-01-01
    相关资源
    最近更新 更多