javascript - 从 Javascript Promise 导出变量
问题描述
背景:
大家好,我正在为网站开发 AJAX 登录功能,我正在尝试使用 Argon2 KDF ( library ) 从之前用户提供的密码中获取浏览器本身中的(某种程度上)资源密集型机密发送到服务器进行验证。该站点使用 TLS,所以我认为从安全的角度来看,这是一个有争议的问题,但我宁愿客户端完成这部分工作而不是服务器,这更像是一种学习体验,而不是生产站点.
问题:
示例代码正确计算了我的项目中的哈希值,可以通过 的输出进行验证console.log(h.hashHex)
,但是我尝试了许多方法来尝试将值分配给一个变量,以便稍后在同一个函数中使用。我意识到 Promise 是异步的,所以我确定我在线程的某个地方出错了。调试时,应该是十六进制字符串的变量要么仍然是 undefined 要么优化掉。我确信我缺少一些简单的东西,但是看着类似的问题(1、2、3)我仍然无法让它工作并且在 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将不起作用,因为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
处理程序有相同的错误,因此请同时更改。)
推荐阅读
- javascript - 我的拖放功能不起作用。我收到一个类型错误。这是什么意思?
- google-cloud-platform - 计算总管道延迟(Cloud Functions -> Pub/Sub -> Dataflow -> BQ)
- design-patterns - Liskov 替换原则 4 题
- c - 每次我声明我的函数时,我的函数所做的变量都会改变。C语言
- c - Munmap_chunk(): 无效指针, Aborted (core dumped), realloc(): 无效的下一个大小
- javascript - 从 webapp 中的按钮访问外部 js 文件中的函数
- labview - 未针对此 I/O 控制类型实现
- php - 数据库连接处于活动状态时,Curl 不起作用
- c++ - 如何在主函数之外访问数组?
- kubernetes - 创建子网管理器失败:asn1:结构错误:标签不匹配