在值数组上使用异步函数的最佳方法?
Best approach to using async functions on array of values?
我有一个关于在值数组上调用异步函数的最佳方法的问题,在 JavaScript。
请注意,在我的环境中,我无法使用任何async/await方法,也无法使用承诺。
例如,在我的例子中,我有这个 SHA256 加密函数:
sha256(not_encrypted_string, function(encrypted_string) {
// do stuff
});
我想使用这个函数来加密未知长度数组中的每个值:
const strings_i_want_to_hash = ["string1", "string2", "string3", "string4", "string5", ...];
所以我的问题是,对所有这些进行哈希处理的最佳方法是什么?我不能使用
const hashed_strings = strings_i_want_to_hash.map(sha256);
...因为它是异步的。对吗?
我能想到的最好的方法是创建一个空数组来放入散列字符串,并等待它与输入数组一样长:
const hashed_strings = [];
strings_i_want_to_hash.forEach(function(str){
sha256(str, function(hashed_str) {
hashed_strings.push(hashed_str);
});
});
while (hashed_strings.length < strings_i_want_to_hash.length) {
continue;
}
...但这似乎是一个非常糟糕的方法。
你们知道更好的处理方法吗?
虽然我没有尝试过您的代码,但我怀疑 while 循环会阻塞线程并且您的程序可能永远不会完成。
一个选项是将您的异步函数包装在另一个跟踪计数的函数中。类似于:
function hashString(str, cb){
// Simulate async op
setTimeout(() => cb('hashed-'+str), 500);
}
function hashManyStrings(strings, cb){
const res = [];
strings.forEach(function(str){
hashString(str, function(hashed){
res.push(hashed);
if(res.length === strings.length){
cb(res);
}
})
})
}
hashManyStrings(['hi', 'hello','much', 'wow'], function(result){
console.log('done', result)
})
我有一个关于在值数组上调用异步函数的最佳方法的问题,在 JavaScript。
请注意,在我的环境中,我无法使用任何async/await方法,也无法使用承诺。
例如,在我的例子中,我有这个 SHA256 加密函数:
sha256(not_encrypted_string, function(encrypted_string) {
// do stuff
});
我想使用这个函数来加密未知长度数组中的每个值:
const strings_i_want_to_hash = ["string1", "string2", "string3", "string4", "string5", ...];
所以我的问题是,对所有这些进行哈希处理的最佳方法是什么?我不能使用
const hashed_strings = strings_i_want_to_hash.map(sha256);
...因为它是异步的。对吗?
我能想到的最好的方法是创建一个空数组来放入散列字符串,并等待它与输入数组一样长:
const hashed_strings = [];
strings_i_want_to_hash.forEach(function(str){
sha256(str, function(hashed_str) {
hashed_strings.push(hashed_str);
});
});
while (hashed_strings.length < strings_i_want_to_hash.length) {
continue;
}
...但这似乎是一个非常糟糕的方法。
你们知道更好的处理方法吗?
虽然我没有尝试过您的代码,但我怀疑 while 循环会阻塞线程并且您的程序可能永远不会完成。
一个选项是将您的异步函数包装在另一个跟踪计数的函数中。类似于:
function hashString(str, cb){
// Simulate async op
setTimeout(() => cb('hashed-'+str), 500);
}
function hashManyStrings(strings, cb){
const res = [];
strings.forEach(function(str){
hashString(str, function(hashed){
res.push(hashed);
if(res.length === strings.length){
cb(res);
}
})
})
}
hashManyStrings(['hi', 'hello','much', 'wow'], function(result){
console.log('done', result)
})