好的,所以我有一个变量 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
或 let
或 var
在那里。严格模式可以防止此错误。
关于javascript - 如何从 Promise 内部设置一个在 Promise 外部初始化的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66828683/