javascript - 如何从 Promise 内部设置一个在 Promise 外部初始化的变量?

标签 javascript firebase promise

好的,所以我有一个变量 valid在 promise 之前定义为 true。然后我有 promise 本身,我想更新 .then(() => {}) 中的有效变量构造函数取决于我从 promise 中收到的信息。但是,由于它是异步发生的,因此似乎存在计时问题。知道如何从 promise 中获取值并更新变量以便我可以在 promise 之外访问该信息吗?

完整代码如下:

var valid = true;
firebase.database().ref(path).once('value')
  .then((snap) => {
    const data = snap.val()


    if (data !== null) {
      for (user in data) {
        if (data[user].Email === Email) {
          valid = false;
        }

      }
    }
  })
  .then(() => {
    return valid
  }

最佳答案

你正在尝试做的事情是每个 JavaScript 程序员(包括我自己)在他们的职业生涯中尝试过并失败的事情。您根本无法让它按照您希望的方式工作。

可以从 Promise 或其他异步回调内部设置全局变量,看起来您的代码应该这样做。

但是,这并不能解决您提到的其他问题:这些回调异步运行

在某个地方,您有一些代码想要查看您的 valid 变量并根据它采取一些操作。但是这段代码如何知道您的 Promise 回调何时完成,因此 valid 有效(双关语)?不会的。

您需要做的就是将该代码放入函数中,从回调中调用它,并将valid标志作为参数传递。这样,在回调确定是否存在无效用户后,该函数将在正确的时间运行。

现在您不需要全局或第二个 promise 回调。它可能看起来像这样:

"use strict";

firebase.database().ref(path).once('value')
  .then((snap) => {
    const data = snap.val();
    if (data) {  // You shouldn't need the '!== null'
      for (const user in data) {  // There was a 'const' missing here
        if (data[user].Email === Email) {
          allUsersAreValid(false);
          return;
        }
      }
    }
    allUsersAreValid(true);
  });

function allUsersAreValid( valid ) {
  // Do something here
}

此外,我还在代码顶部添加了一个 "use strict"; 以将其置于严格模式,并建议您也始终这样做。 for (user in data) 无意中创建了一个全局变量 user,因为没有 const letvar 在那里。严格模式可以防止此错误。

关于javascript - 如何从 Promise 内部设置一个在 Promise 外部初始化的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66828683/

相关文章:

angular - 如何确保在从类调用函数之前完成构造函数/ngOnInit?

javascript - JQuery 让第二个 parent 不工作

javascript - 为什么此 D3 代码将 <p> 元素添加到主体外部,而不是内部?

javascript - 参数未传递到 firebase 云函数中的本地函数

javascript - node.js redis 以及在使用模块时如何使用 promise

javascript - 获取多个 promise ,只返回一个

Javascript - 滚动事件停止元素滚动

javascript - 无法弄清楚 onMouseOver

java - map 上未显示位置

android - firebase 监听器实际上是如何工作的?