在值数组上使用异步函数的最佳方法?

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)
})