从Javascript承诺导出变量

从Javascript承诺导出变量,javascript,multithreading,promise,Javascript,Multithreading,Promise,背景: 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)); ... } function submitLogin(email, pass) { .

背景:

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));
  ...
}
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;});
}
大家好,我正在为一个网站开发一个AJAX登录函数,我正在尝试使用Argon2 KDF()从用户提供的密码中导出一个(某种程度上)资源密集型的秘密,然后再将其发送到服务器进行验证。该站点使用TLS,因此我认为从安全角度来看,这是一个没有实际意义的问题,但我更希望客户端完成这部分工作,而不是服务器,这更像是一种学习体验,而不是一个生产站点

问题:

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));
  ...
}
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;});
}
示例代码正确地计算了我的项目中的哈希值,可通过
console.log(h.hashHex)
的输出进行验证,但我尝试了几十种方法,尝试将值分配给变量,以便稍后在同一函数中使用。我意识到承诺是异步的,所以我肯定我在线程方面出了问题。调试时,应为十六进制字符串的变量仍然未定义或为空。我确信我遗漏了一些简单的东西,但看看类似的问题(,),我仍然无法让它工作,而且在JavaScript方面也没有太多经验。谢谢你的意见

示例代码(有效)

修改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));
  ...
}
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;});
}
修改2(也不起作用):

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));
  ...
}
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;});
}
更新(回答如下)


修改1将不起作用,因为
密码将在
do\u login
返回后异步设置

修改2由于输入错误而无法工作;你有

.then(h=>函数(h){submitLogin(email,h.hashHex);返回false;})
但是它同时使用了一个箭头函数
h=>
和一个
函数(h)
,是实际需要的函数的两倍。这应该更好地发挥作用:

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

(在下一行中,
catch
处理程序有相同的bug,所以将两者都更改。)

明白了,谢谢!早些时候我在摆弄的时候有正确的argon2.hash()行,但那是在我将它分成两个函数并开始更改内容之前。我会用答案更新我的问题。