从Javascript Promise导出变量

时间:2019-01-24 00:26:21

标签: javascript multithreading promise

背景

大家好,我正在为网站使用AJAX登录功能,并且尝试使用Argon2 KDF(library)来从浏览器本身派生(某种程度上)资源密集型秘密用户提供的密码,然后将其发送到服务器进行验证。该站点使用TLS,所以我认为从安全角度讲这是一个有争议的问题,但是我宁愿客户端而不是服务器来完成这部分工作,这反而是一种学习经验,而不是生产站点。

问题:

示例代码正确计算了项目中的哈希,可以通过console.log(h.hashHex)的输出进行验证,但是我尝试了数十种方法来尝试将值分配给变量,以便稍后在同一函数中使用。我意识到Promise是异步的,所以我确定我在有关线程的某个地方出错了。调试时,应为十六进制字符串的变量仍未定义或为optimized away。我确定我缺少一些简单的东西,但是看着类似的问题(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;
}

1 个答案:

答案 0 :(得分:2)

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

修改2 由于出现错字而无法使用;你有

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

但是这同时使用了箭头功能h =>和箭头function (h),都是您实际想要的两倍。这样应该可以更好地工作:

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

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