如何解析异步变量?
How to resolve asynchronous variable?
我正在尝试根据共享密钥是否已存在于数据库中来获取它。我正在使用 Firebase 商店数据库。
问题是,即使我在子函数内部为 passkey 分配了一些值,当我在函数外部执行 console.log 时,它只会打印在声明时设置的原始 passkey。
我尝试通过在所有函数之外将 passkey 声明为全局变量来使用 window.passkey 和 window.global.passkey,但它没有用。
我正在处理一个 node.js 项目。我的代码如下:
// var passkey = {"shared_key":""} // Declaring passkey as global variable but didn't work.
const onSubmit = (formData) => {
const email_id = getUserDetails().email;
const from_db = db.collection(email_id);
const to_db = db.collection(formData.to);
var passkey = {"shared_key": ""};
// Check if there exists a shared key between `from` and `to`
// Checking for shared key in either of the db is enough.
to_db.doc(email_id).get().then((res) => {
// assume that res.exists is true.
if (res.exists) {
passkey.shared_key = res.data().shared_key; // passkey is set here
} else {
// Generate and use a shared key
...some code to generate a shared key ...
passkey.shared_key = generated_key;
}
});
console.log(passkey);
// above prints {"shared_key": ""} instead of printing the value of shared key taken from the database.
// or the one that is generated!
};
我知道它与 javascript 中的变量提升有关,但我认为必须有一些解决方法。
任何 help/comment 表示赞赏。提前致谢。
当您使用此模式编码时
function doIt () {
var something = ''
invokeFunction()
.then (function handleResult (result) {
console.log('2', something)
something = result
} )
console.log('1', something)
}
你的 console.log('1', something)
在调用内部函数(为了清楚起见,我将其命名为 handleResult
)之前运行。那是因为 invokeFunction()
是异步的;它 returns 一个 Promise
object.
你可以重写如下:
async function doIt () {
var something = await invokeFunction()
console.log('1', something)
}
以获得您想要的结果。
恕我直言,除非您花时间学习 async / await 和 Promises,否则您将很难编码 Javascript。在这方面,Javascript 语言与其他语言有很大不同。放下一切,现在就学习那些东西。说真的。
我正在尝试根据共享密钥是否已存在于数据库中来获取它。我正在使用 Firebase 商店数据库。
问题是,即使我在子函数内部为 passkey 分配了一些值,当我在函数外部执行 console.log 时,它只会打印在声明时设置的原始 passkey。
我尝试通过在所有函数之外将 passkey 声明为全局变量来使用 window.passkey 和 window.global.passkey,但它没有用。
我正在处理一个 node.js 项目。我的代码如下:
// var passkey = {"shared_key":""} // Declaring passkey as global variable but didn't work.
const onSubmit = (formData) => {
const email_id = getUserDetails().email;
const from_db = db.collection(email_id);
const to_db = db.collection(formData.to);
var passkey = {"shared_key": ""};
// Check if there exists a shared key between `from` and `to`
// Checking for shared key in either of the db is enough.
to_db.doc(email_id).get().then((res) => {
// assume that res.exists is true.
if (res.exists) {
passkey.shared_key = res.data().shared_key; // passkey is set here
} else {
// Generate and use a shared key
...some code to generate a shared key ...
passkey.shared_key = generated_key;
}
});
console.log(passkey);
// above prints {"shared_key": ""} instead of printing the value of shared key taken from the database.
// or the one that is generated!
};
我知道它与 javascript 中的变量提升有关,但我认为必须有一些解决方法。 任何 help/comment 表示赞赏。提前致谢。
当您使用此模式编码时
function doIt () {
var something = ''
invokeFunction()
.then (function handleResult (result) {
console.log('2', something)
something = result
} )
console.log('1', something)
}
你的 console.log('1', something)
在调用内部函数(为了清楚起见,我将其命名为 handleResult
)之前运行。那是因为 invokeFunction()
是异步的;它 returns 一个 Promise
object.
你可以重写如下:
async function doIt () {
var something = await invokeFunction()
console.log('1', something)
}
以获得您想要的结果。
恕我直言,除非您花时间学习 async / await 和 Promises,否则您将很难编码 Javascript。在这方面,Javascript 语言与其他语言有很大不同。放下一切,现在就学习那些东西。说真的。