gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 07:53:22 24 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Why is my variable unaltered after I modify it inside of a function? - Asynchronous code reference

(6 个回答)


5 个月前关闭。




好的,所以我有一个变量 valid在 promise 之前定义为真。然后我有自己的 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因为没有 constletvar那里。严格模式将防止此错误。

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com