微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何解决异步变量?

如何解决如何解决异步变量?

我正在尝试根据数据库中是否已存在共享密钥来获取共享密钥。我正在使用 Firebase 商店数据库
问题是,即使我在子函数内为密码分配了一些值,当我在函数外执行 console.log 时,它只会打印在声明时设置的原始密码。
我尝试通过在所有函数之外将 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 中的变量提升有关,但我认为必须有一些解决方法。 任何帮助/评论表示赞赏。提前致谢。

解决方法

当你用这种模式编码时

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() 是异步的;它返回一个 Promise object

你可以这样重写:

async function doIt () {
  var something = await invokeFunction()
  console.log('1',something)
}

得到你想要的那种结果。

顺便说一句,除非您花时间学习 async / await 和 Promises,否则您将很难编写 Javascript。在这方面,Javascript 语言与其他语言非常不同。放下一切,现在学习那些东西。认真的。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。