首页 > 解决方案 > 从 Javascript Promise 导出变量

问题描述

背景:

大家好,我正在为网站开发 AJAX 登录功能,我正在尝试使用 Argon2 KDF ( library ) 从之前用户提供的密码中获取浏览器本身中的(某种程度上)资源密集型机密发送到服务器进行验证。该站点使用 TLS,所以我认为从安全的角度来看,这是一个有争议的问题,但我宁愿客户端完成这部分工作而不是服务器,这更像是一种学习体验,而不是生产站点.

问题:

示例代码正确计算了我的项目中的哈希值,可以通过 的输出进行验证console.log(h.hashHex),但是我尝试了许多方法来尝试将值分配给一个变量,以便稍后在同一个函数中使用。我意识到 Promise 是异步的,所以我确定我在线程的某个地方出错了。调试时,应该是十六进制字符串的变量要么仍然是 undefined 要么优化掉。我确信我缺少一些简单的东西,但是看着类似的问题(123)我仍然无法让它工作并且在 JavaScript 方面没有太多经验。感谢您的输入!

示例代码(作品)

argon2.hash({ pass: $("#password").val(), salt: 'somesalt' })
.then(h => console.log(h.hash, h.hashHex, h.encoded))
.catch(e => console.error(e.message, e.code));

修改1(不起作用):

function do_login() {
  ...
  var password;
  argon2.hash({ pass: $("#password").val(), salt: 'somesalt' })
  .then(h => {password=h.hashHex})
  .catch(e => console.error(e.message, e.code));
  ...
}

修改2(也不起作用):

function submitLogin(email, pass) {
  ...
  $.ajax
  ({
    type:'post',
    url:'/login',
    data:{
      do_login:"do_login",
      email:email,
      password:pass
    },
    success:function(response) {
      ...
    }
  });
}

function do_login()
{
  var email=$("#username").val();
  var password = $("#password").val();
  argon2.hash({ pass: password, salt: 'somesalt' })
  .then(h=> function(h){submitLogin(email,h.hashHex);return false;})
  .catch(e => function(e){console.error(e.message, e.code);return false;});
}

更新(下面的答案)

function submitLogin(email, pass) {
  ...
  $.ajax
  ({
    type:'post',
    url:'/login',
    data:{
      do_login:"do_login",
      email:email,
      password:pass
    },
    success:function(response) {
    ...
    }
  });
}

function do_login()
{
  var email=$("#username").val();
  var password = $("#password").val();
  argon2.hash({ pass: password, salt: 'somesalt' })
  .then(h=>submitLogin(email,h.hashHex))
  .catch(e => console.error(e.message, e.code));
  return false;
}

标签: javascriptmultithreadingpromise

解决方案


修改 1将不起作用,因为password将在稍后do_login返回之后异步设置。

由于拼写错误,修改 2不起作用;你有

.then(h=> function(h){submitLogin(email,h.hashHex);return false;})

但这同时使用箭头函数h =>和 a function (h),是您实际想要的函数的两倍。这应该会更好:

.then(h => { submitLogin(email, h.hashHex); })

(不过,在下一行中,catch处理程序有相同的错误,因此请同时更改。)


推荐阅读